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

Posted

技术标签:

【中文标题】如何使用 curl 正确发送和接收 XML?【英文标题】:How to properly send and receive XML using curl? 【发布时间】:2011-12-16 12:02:26 【问题描述】:

我一直在尝试发布 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

【问题讨论】:

您可以访问 somedomain.com 的服务器日志吗?很难说 400 到底想说什么.. 您可能想尝试将 XML 发布到您自己服务器上的脚本中,并确保接收到的数据符合您的预期。 【参考方案1】:

这有帮助吗?

<?php
$url = "http://***.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);
?>

【讨论】:

【参考方案2】:

来自the documentation。

CURLOPT_CUSTOMREQUEST

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

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

【讨论】:

或者正如@James提到的,你可以更简洁地使用CURLOPT_POST

以上是关于如何使用 curl 正确发送和接收 XML?的主要内容,如果未能解决你的问题,请参考以下文章

如何使发送和接收方法同时工作?

linux下,socket服务器和客户端TCP方式建立了连接,如何使它们之间相互发送消息?

我将如何编写这个 curl 请求

如何通过 Solana JSONRPC 发送和接收令牌

如何删除 cURL 发送的默认标头?

PHP4:通过 cURL 通过 HTTPS/POST 发送 XML?