PHP cURL-запрос завершается неудачно, но работает с Postman / curl из Bash

0

Я столкнулся с очень странной ситуацией. Выполнение запроса в 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!
  • 0
    Есть некоторые вещи, которые вы можете отправить с помощью запроса curl для отладки того, что происходит на самом деле, попробуйте заменить его на curl_exec() : curl_setopt(CURLOPT_HEADER, true);curl_setopt(CURLOPT_FAILONERROR, FALSE); var_dump(curl_exec());die;
  • 0
    Вы использовали какой-либо прокси?
Показать ещё 5 комментариев
Теги:
curl

1 ответ

1
Лучший ответ

Команда curl в порядке, но код на удаленном сервере пытается загрузить файл с помощью fopen. Это не удается, и сообщение об ошибке возвращается как часть ответа на ваш код вызова. Похоже, что удаленный код пытается открыть URL-адрес на основе некоторого ввода, который он получает от клиента; что вход от вашей команды curl отличается от ввода Postman. Чтобы выяснить, какой именно элемент в заголовках HTTP или POST-контенте является виновником, вам нужно заглянуть в код удаленного сервера (service.php) или выполнить пробную версию, сравнив точное содержимое запроса Postman с запрос CURL.

  • 0
    Благодарю. Я не могу поверить, что я упустил это. Оказывается, проблема была связана с параметром, установленным в логическое значение true. Изменение в строку решило проблему. Еще раз спасибо!
  • 0
    Можете ли вы указать, какой это был параметр? Я сталкиваюсь с той же ошибкой, но все еще не могу понять. Это код, который я использую: $ data2 = 'redirect_uri = xxxmyredirecturixxx & client_id = xxxxmyclientidxxx & client_secret = xxxxmyclientsecretxxxxx & refresh_token = xxxrefreshtokenofmyaccountxxx & type = refresh'; curl_setopt ($ ch, CURLOPT_URL, launchpad.37signals.com/authorization/token ' ); curl_setopt ($ ch, CURLOPT_POST, true); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, true); curl_setopt ($ ch, CURLOPT_VERBOSE, true); curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ data2);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню