我处于无法使用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;
没有错误或警告。只是,接受服务器不会出现在内容中。有什么想法吗?
答案 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;
}