Я столкнулся с очень странной ситуацией. Выполнение запроса в Postman для веб-службы работает правильно (x-www-form-urlencoded) с несколькими параметрами.
Однако, когда я делаю этот запрос с использованием PHP cURL, запрос терпит неудачу с ответом, подобным этому:
Failed to Connect, fopen(http://10.0.0.8:8080/posts?foo=bar&bar=baz): failed to open stream: HTTP request failed!
Веб-служба, похоже, написана с использованием PHP, конечная точка такая, как http://foo.com/service.php.
Почтальон будет работать в 100% случаев, запрос cURL, сделанный от Bash, работает в 100% случаев.
Для меня крайне странно, что он пытается разрешить внутренний IP-адрес и что он только терпит неудачу при использовании библиотеки php cURL.
Надеюсь, кто-то может пролить свет на это или испытал это раньше. Я пробовал почти все варианты завитки, которые можно было бы заставить работать, но не повезло. Любая помощь будет оценена по достоинству.
Код:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, self::SERVICE_ENDPOINT);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $paramString);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FAILONERROR, false);
var_dump(curl_exec($ch));
die;
Подробный вывод:
HTTP/1.1 200 OK
Date: Tue, 06 Jan 2015 09:27:20 GMT
Server: Apache
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Last-Modified: Tue, 06 Jan 2015 09:27:20 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Length: 324
Content-Type: text/html
Failed to Connect, fopen(http://10.0.0.8:8080/posts?foo=bar&bar=baz): failed to open stream: HTTP request failed!
Команда curl в порядке, но код на удаленном сервере пытается загрузить файл с помощью fopen
. Это не удается, и сообщение об ошибке возвращается как часть ответа на ваш код вызова. Похоже, что удаленный код пытается открыть URL-адрес на основе некоторого ввода, который он получает от клиента; что вход от вашей команды curl отличается от ввода Postman. Чтобы выяснить, какой именно элемент в заголовках HTTP или POST-контенте является виновником, вам нужно заглянуть в код удаленного сервера (service.php
) или выполнить пробную версию, сравнив точное содержимое запроса Postman с запрос CURL.
curl_exec()
:curl_setopt(CURLOPT_HEADER, true);curl_setopt(CURLOPT_FAILONERROR, FALSE); var_dump(curl_exec());die;