如何使用curl正确发送和接收XML?

时间:2011-10-27 13:00:46

标签: php xml http post curl

我一直在尝试发布XML并从服务器获得响应,但没有运气。

以下是服务器端的条件:

  • 对服务器的请求应通过HTTP 1.1发送为XML。

以下要求适用于HTTP请求:

  • 请求类型应为POST;
  • 应存在Content-Length标头,请求的总长度应低于16KB;
  • 应该存在Content-Type标头,其中包含媒体类型值text/xml;

这是我的剧本:

$url = "http://somedomain.com";
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<Request PartnerID="asasdsadsa" Type="TrackSearch"> <TrackSearch> <Title>love</Title>    <Tags> <MainGenre>Blues</MainGenre> </Tags> <Page Number="1" Size="20"/> </TrackSearch> </Request>';
$header  = "POST HTTP/1.1 \r\n";
$header .= "Content-type: text/xml \r\n";
$header .= "Content-length: ".strlen($xml)." \r\n";
$header .= "Connection: close \r\n\r\n"; 
$header .= $xml;
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $header);
$data = curl_exec($ch); 
echo $data;
if(curl_errno($ch))
    print curl_error($ch);
else
    curl_close($ch);

这给了我:

 HTTP Error 400. The request URL is invalid.
 Bad Request - Invalid URL

2 个答案:

答案 0 :(得分:14)

这有帮助吗?

<?php
$url = "http://stackoverflow.com";
$xml = '<?xml version="1.0" encoding="UTF-8"?><Request PartnerID="asasdsadsa" Type="TrackSearch"> <TrackSearch> <Title>love</Title>    <Tags> <MainGenre>Blues</MainGenre> </Tags> <Page Number="1" Size="20"/> </TrackSearch> </Request>';

$headers = array(
    "Content-type: text/xml",
    "Content-length: " . strlen($xml),
    "Connection: close",
);

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$data = curl_exec($ch); 
echo $data;
if(curl_errno($ch))
    print curl_error($ch);
else
    curl_close($ch);
?>

答案 1 :(得分:0)

来自the documentation

  

CURLOPT_CUSTOMREQUEST

     

使用自定义请求方法代替“GET”   或者在执行HTTP请求时“HEAD”。这对于“DELETE”很有用   或其他更模糊的HTTP请求。有效值是类似的东西   “GET”,“POST”,“CONNECT”等;即,不要输入整个HTTP   请求行在这里。例如,输入“GET /index.html   HTTP / 1.0 \ r \ n \ r \ n“将是不正确的。

CURLOPT_CUSTOMREQUEST的参数应该只是POST,您可以使用CURLOPT_HTTPHEADER来设置标题。