PHP cURL到POST工作,但不是在我没有cURL的情况下POST - 我缺少什么?

时间:2010-09-03 18:08:30

标签: php http post curl

我处于无法使用PHP cURL模块POST表单数据的情况。我找到了一篇很棒的博客文章,展示了如何在不使用cURL的情况下进行POST: HTTP POST from PHP, without cURL

这是我的问题。当我尝试发送POST请求时,请求命中(其他)服务器,但不传输内容(POST数据)。另一台服务器无法获取内容。但是,如果我使用cURL,它工作正常。我错过了什么?如何在不使用cURL的情况下重新创建cURL HTTP POST请求?

以下是可行的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 个答案:

答案 0 :(得分:1)

您的$method可能未填充'POST'。另一个主要原因是open_basedir限制,但这会产生警告。

尝试明确命名“POST”

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

答案 1 :(得分:1)

您的非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;
}