我正在尝试创建一个xml post请求,该请求需要使用curl进行响应来构建标头和内容。这是我的代码:
<?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 Unprocessable Entity错误。我完全错过了什么吗?我希望能够在发送的请求中看到XML。
答案 0 :(得分:2)
您尚未为XML内容指定字段名,因此PHP无法在POST请求中分配它。正如manual所述:
此参数既可以作为urlencoded字符串传递,例如'para1 = val1&amp; para2 = val2&amp; ...',也可以作为数组传递,字段名称为键,字段数据为值。
所以试试:
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标记。
答案 1 :(得分:0)
echo($info['request_header']);
只会显示已发送的标头。它不会显示发布数据,因此您不应该看到XML字符串。
答案 2 :(得分: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);