[我正在使用PHP CURL将一些xml数据发布到使用该IP的另一台服务器,我满足了使它工作的所有要求,但仍然收到“ BAD REQUEST”错误。
请看下面的代码。
$var2 ="<doc><item>Some content.</item></doc>";
$url = "server IP";
$header = "POST HTTP/1.1 \r\n";
$header .= "Content-type: text/xml \r\n";
$header .= "Content-length: ".strlen($var2)." \r\n";
$header .= "Content-transfer-encoding: text \r\n";
$header .= "Connection: close \r\n\r\n";
$header .= $var2;
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 4);
curl_setopt($ch, CURLOPT_POSTFIELDS, $var2);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $header);
// Get Response
$data = curl_exec($ch);
if(curl_errno($ch))
print curl_error($ch);
else
curl_close($ch);
echo $data;
首先,您正在使用它作为请求行:
$header = "POST HTTP/1.1 \r\n";
根据HTTP 1.1 RFC,**Request-Line**
应该看起来像这样:
**Request-Line**
所以,看来您应该在Request-Line = Method SP Request-URI SP HTTP-Version CRLF
和POST
之间添加一个URI(但是,在编码之前,请先阅读我在答案的下一段中写的内容)
然后,您传递了很多内容,例如HTTP/1.1
。我认为您不能使用该选项(引号)传递所有这些标头:
有效值是“
CURLOPT_CUSTOMREQUEST
”,“GET
”,“POST
”等;即,请勿在此处输入整个HTTP请求行。对于例如,输入“CONNECT
”将是不正确。
如果要指定自定义标题(似乎可以),则应使用GET /index.html HTTP/1.0\r\n\r\n
选项,而不要使用CURLOPT_HTTPHEADER
(引用第一个文件的文档):
要设置的HTTP标头字段数组,格式为
CURLOPT_CUSTOMREQUEST