在PHP中使用CURL发布XML数据获取错误请求

在PHP中使用CURL发布XML数据获取错误请求,php,libcurl,Php,Libcurl,我使用PHPCURL将一些xml数据发布到另一台使用该IP的服务器上,我满足了使其工作的所有要求,但仍然得到一个错误“坏请求” 看看下面的代码 $var2 ="<doc><item>Some content.</item></doc>"; $url = "server IP"; $header = "POST HTTP/1.1 \r\n"; $header .= "Content-type: text/xml

我使用PHPCURL将一些xml数据发布到另一台使用该IP的服务器上,我满足了使其工作的所有要求,但仍然得到一个错误“坏请求”

看看下面的代码

 $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;
$var2=“一些内容。”;
$url=“服务器IP”;
$header=“POST HTTP/1.1\r\n”;
$header.=“内容类型:text/xml\r\n”;
$header.=“内容长度:”.strlen($var2)。“\r\n”;
$header.=“内容传输编码:文本\r\n”;
$header.=“连接:关闭\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_超时,4);
curl_setopt($ch,CURLOPT_POSTFIELDS,$var2);
curl_setopt($ch,CURLOPT_CUSTOMREQUEST,$header);
//得到回应
$data=curl\u exec($ch);
if(旋度误差($ch))
打印卷曲错误($ch);
其他的
卷曲关闭($ch);
回波数据;

首先,您使用此作为请求行:

$header  = "POST HTTP/1.1 \r\n";
根据图中所示,应如下所示:

Request-Line   = Method SP Request-URI SP HTTP-Version CRLF
因此,您似乎应该在
POST
HTTP/1.1

(但是,在编写代码之前,请阅读我在回答的下一段中所写的内容)


然后,您将传递许多内容,如
CURLOPT\u CUSTOMREQUEST

我不认为您可以使用该选项(引用)传递所有这些标题:

有效值包括“
GET
”、“
POST
”、“
CONNECT
”等;
i、 不要在这里输入整个HTTP请求行<用于 例如,输入“
GET/index.html HTTP/1.0\r\n\r\n
”将是 不对


如果您想指定自定义标题(似乎是这样),应该使用
CURLOPT\u HTTPHEADER
选项,而不是
CURLOPT\u CUSTOMREQUEST
(引用第一个标题的文档):

要设置的HTTP头字段数组,格式为
array('Content-type:text/plain','Content-length:100')