есть ли другой способ сделать этот HTTP-запрос в php?

function do_post_request($url, $data, $optional_headers = null) {

    $request = new HttpRequest($url, HttpRequest::METH_POST);
    $request->setBody($data);
        $response = $request->send();
        return $response->getBody();

}

Этот фрагмент кода, похоже, не работает и, похоже, приводит к сбою моего скрипта. Я не знаю, потому что у меня нет модуля php_http, но есть ли эквивалент, который я могу использовать?

Например завиток? Я пробовал использовать curl, но я мало о нем знаю, и с помощью curl я получил "плохой запрос", возвращенный с сервера, к которому я пытался подключиться со статусом 400.

Все было бы хорошо

Спасибо

Том

Редактировать:

function do_post_request($url, $data, $optional_headers = null) {


    $request = new HttpRequest($url, HttpRequest::METH_POST);
     $request->setBody($data);
  $response = $request->send();
  return $response->getBody();

}


echo "before";

$response = do_post_request($url, $data);
echo "After";

При этом на странице появляется «до». Но не «После».

После того, как мне удалось включить отчет об ошибках, я получаю следующее:

Fatal error: Class 'HttpRequest' not found in /home/sites/ollysmithwineapp.com/public_html/mellowpages/geocode.php on line 25

Поэтому мне нужен другой способ выполнить HTTP-запрос.


person Thomas Clayson    schedule 13.10.2010    source источник
comment
Curl подойдет, но сначала убедитесь, посмотрев, в чем на самом деле проблема. Установите error_reporting(E_ALL);, чтобы увидеть ошибки   -  person Pekka    schedule 13.10.2010
comment
это не работает по какой-то причине ... все еще просто пустая страница ...   -  person Thomas Clayson    schedule 13.10.2010
comment
Пустая страница может указывать на то, что отображение ошибки отключено. Проверьте свой php.ini файл на наличие этой опции и включите ее.   -  person Victor Nicollet    schedule 13.10.2010
comment
ini_set ('display_errors', 1); // Включить отображение ошибок   -  person Māris Kiseļovs    schedule 13.10.2010
comment
400 - неправильный синтаксис. Вы уверены, что URL-адрес, который вы используете, действителен?   -  person bcosca    schedule 13.10.2010
comment
Как я и думал: Fatal error: Class 'HttpRequest' not found in /home/sites/........com/public_html/mellowpages/geocode.php on line 25 так ... как еще я мог это сделать?   -  person Thomas Clayson    schedule 14.10.2010


Ответы (4)


Уверены, что расширение HTTP установлено и правильно настроено?

Установка / Конфигурация

Установка

Это расширение »PECL не входит в комплект PHP.

Информацию по установке этого расширения PECL можно найти в главе руководства, озаглавленной «Установка расширений PECL». Дополнительную информацию, такую ​​как новые выпуски, загрузки, исходные файлы, информацию о разработчике и CHANGELOG, можно найти здесь: »http://pecl.php.net/package/pecl_http.

и, возможно, cURl - это то, что вам нужно

person teemitzitrone    schedule 14.10.2010
comment
эта вторая ссылка сделала это. :) Спасибо - person Thomas Clayson; 14.10.2010

Украдено из этого вопроса. Вы можете вставить $data прямо там, где CURLOPT_POSTFIELDS установлено вместо строки запроса.

<?php
//
// A very simple PHP example that sends a HTTP POST to a remote site
//

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,"http://www.mysite.com/tester.phtml");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,
            "postvar1=value1&postvar2=value2&postvar3=value3");

// receive server response ...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$server_output = curl_exec ($ch);

curl_close ($ch);

// further processing ....
if ($server_output == "OK") { ... } else { ... }

?>
person Pekka    schedule 14.10.2010
comment
а что может взять строку XML? - person Thomas Clayson; 14.10.2010
comment
@ Томас, как? Что ты имеешь в виду? - person Pekka; 14.10.2010
comment
в основном $ data - это содержимое XML-файла, я предполагаю, что это возможно, и я пытаюсь это сделать. :) - person Thomas Clayson; 14.10.2010
comment
@Thomas, вы можете, просто убедитесь, что вы добавили имя поля (если вы не анализируете необработанный запрос POST на принимающей стороне). - person Pekka; 14.10.2010
comment
Большое спасибо, pekka :) ответ пришел по ссылке в ответе @ maggie, однако вы очень помогли, спасибо. :) - person Thomas Clayson; 14.10.2010

Я также нашел решение, используя stream_context_create (). Это дает вам больше контроля над тем, что вы отправляете в POST.

Вот сообщение в блоге, объясняющее, как это сделать. Это позволяет легко указать точные заголовки и тело.

http://wezfurlong.org/blog/2006/nov/http-post-from-php-without-curl/

person trestacos    schedule 31.10.2011

Нет HttpRequest::setBody() метода. Вместо этого вы должны использовать функцию addPostFields, используя ассоциативный массив:

function do_post_request($url, $data, $optional_headers = null) {
    $request = new HttpRequest($url, HttpRequest::METH_POST);
    $request->setPostFields($data);
    $response = $request->send();
    return $response->getBody();
}

$responseBody = do_post_request('http://www.example.com',array('examplefield'=>'exampledata'));
person lonesomeday    schedule 13.10.2010
comment
Мне нужно отправить содержимое переменной $ data (которая на данный момент является содержимым XML-документа). Как мне это сделать? - person Thomas Clayson; 14.10.2010