2011-06-24 80 views
2

我试图做一个XML发布请求,期望使用curl响应来构建标题和内容。这是我的代码:PHP卷曲问题 - 试图发送XML发布请求

<?php 
function post_xml($url, $xml) { 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_HEADER, true); 
    curl_setopt($ch, CURLINFO_HEADER_OUT, true); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content-Type: application/xml; charset=utf-8")); 
    curl_setopt($ch, CURLOPT_USERPWD, 'myusername:mypassword'); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 

    $result = curl_exec($ch); 
    $info = curl_getinfo($ch); 
    curl_close($ch); 
    return $result; 
} 

$xml = '<?xml version="1.0" encoding="UTF-8"?><testing><test type="integer">1</test></testing>'; 

$url = "http://example.com/api/test.php"; 
$result = post_xml($url, $xml); 
echo "<pre>"; print_r($result); echo "</pre>"; 
?> 

要查看我的呼出请求我使用:

$info = curl_getinfo($ch); 
echo($info['request_header']); 

所发送的生成的HTTP请求是:

POST /api/test.php HTTP/1.1 
Authorization: Basic pwmtJdCVwNEawdaODH 
Host: example.com 
Accept: */* 
Content-Type: application/xml; charset=utf-8 
Content-Length: 95 

的内容长度为95,但是下面没有显示任何xml内容。这会导致422不可处理的实体错误。我完全错过了什么吗?我希望能够在发送的请求中看到XML。

+0

问题必须与远程API;你的代码肯定是在移动数据。我用一个脚本测试它,它只会将原始postbody转储到测试文件并返回请求的散列,并且它工作得很好。 – Dereleased

+0

等待!你在浏览器中查看这个吗?它可能会隐藏你的XML!试试这个,而不是print_r:'echo'

', htmlentities($result), '
';' – Dereleased

+0

对不起,我发布的请求是原始请求。我认为这可能是我尝试使用的API的一个问题,所以我会与他们联系。这一直都让我坚持了整整一个早上,但我完全遵循他们的文档。 – Brian

回答

2

您还没有为您的XML内容指定一个字段名,所以PHP无处可以在POST请求中分配它。作为manual状态:

此参数可以或者作为像urlencoded的字符串被传递“PARA1 = VAL1 & PARA2 = val2的& ...”或者作为与字段名作为值作为密钥和字段数据的数组。

所以尝试:

curl_setopt($ch, CURLOPT_POSTFIELDS, array('xml' => $xml)); 

不知道如果这是你的API期待,但它是一个事看看。

至于显示XML,请记住,浏览器可以/将它解释为HTML,并且任何未知标记将不会被显示。试着做你的输出:

echo "<pre>"; 
echo htmlspecialchars($result); 
echo "</pre>"; 

和/或输出header('Content-type: text/plain')这样XML标签将被原样显示和不能被解释为未知的HTML标签。

0
echo($info['request_header']); 

将只显示已发送的标头。它不会显示发布数据,所以你不应该看到XML字符串。

+0

有什么方法可以轻松查看发送的整个消息吗? – Brian

0

它的工作原理,当我删除了标题行:

//curl_setopt($ch, CURLOPT_HTTPHEADER, ... 

最终代码:

curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, array('data' => $xml)); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);