PHP cURL to POST работает, но не тогда, когда я POST без cURL - Что мне не хватает? - PullRequest
0 голосов
/ 03 сентября 2010

Я нахожусь в ситуации, когда я не могу использовать модуль PHP cURL для размещения данных формы.Я нашел большое сообщение в блоге, показывающее, как POST без использования cURL здесь: HTTP POST из PHP, без cURL

Вот моя проблема, хотя.Когда я пытаюсь отправить свой запрос POST, запрос попадает на (другой) сервер, но содержимое (данные POST) не передается.Другой сервер не получает контент.ОДНАКО, если я использую cURL, он работает нормально.Что мне не хватает?Как я могу восстановить запрос PUR cURL HTTP без использования cURL?

Вот код cURL, который работает ($ this-> params - это всего лишь $ _POST, который содержит данные формы):

$ch = curl_init($this->url);

$params = http_build_query($this->params);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params );
curl_setopt($ch, CURLOPT_FOLLOWLOCATION  ,1);
curl_setopt($ch, CURLOPT_HEADER      ,0);  // DO NOT RETURN HTTP HEADERS
curl_setopt($ch, CURLOPT_RETURNTRANSFER  ,1);  // RETURN THE CONTENTS OF THE CALL

$result = curl_exec($ch);
curl_close($ch);

return $result;

А вот моя не-CURL-версия, которая не работает:

$postStr = http_build_query($this->params);

$opts = array(
    'http'=>array(
        'method' => $method,
        //'header' => 'Content-type: application/x-www-form-urlencoded',
        //'header' => 'content-type: multipart/form-data',
        'content-type' => 'application/x-www-form-urlencoded',
        'content-encoding' => 'UTF-8',
        'content' => $postStr
    )
);

$context = stream_context_create($opts);

$result = file_get_contents($this->url, false, $context);

return $result;

Нет ошибок или предупреждений.Просто принимающий сервер не отображается в содержимом.Есть идеи?

Ответы [ 2 ]

1 голос
/ 03 сентября 2010

Ваша версия без CURL является неполной .

вы должны использовать fopen после создания контекста с stream_context_create.

Решение: Используйте эту функцию: Сделайте так:

<?php
function do_post_request($url, $data, $optional_headers = null)
{
  $params = array('http' => array(
              'method' => 'POST',
              'content' => $data
            ));

  if ($optional_headers !== null)
      $params['http']['header'] = $optional_headers;

  $ctx = stream_context_create($params);
  $fp = @fopen($url, 'rb', false, $ctx);

  if (!$fp)
      throw new Exception("Problem with $url, $php_errormsg");

  $response = @stream_get_contents($fp);

  if ($response === false)
      throw new Exception("Problem reading data from $url, $php_errormsg");

  return $response;
}
1 голос
/ 03 сентября 2010

Вероятно, ваш $method не заполнен 'POST'.Другой основной причиной было бы ограничение open_basedir, но это вызвало бы предупреждение.

Попробуйте явно назвать "POST"

$opts = array(
    'http'=>array(
        'method' => 'POST',
        'content-type' => 'application/x-www-form-urlencoded',
        'content-encoding' => 'UTF-8',
        'content' => $postStr
    )
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...