【问题标题】:PHP curl issue - Trying to send XML post requestPHP curl 问题 - 尝试发送 XML 发布请求
【发布时间】:2011-06-24 15:18:02
【问题描述】:

我正在尝试发出一个 xml 发布请求,该请求期望使用 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

content-length 是 95,但它没有显示下面的任何 xml 内容。这会导致 422 Unprocessable Entity 错误。我完全错过了什么吗?我希望能够在发送的请求中看到 XML。

【问题讨论】:

  • 问题一定出在远程 API 上;您的代码肯定是在移动数据。我使用一个脚本对其进行了测试,该脚本将原始 postbody 转储到测试文件并返回请求的哈希值,它工作得很好。
  • 等等!您是在浏览器中查看此内容吗?它可能对您隐藏了 XML!试试这个而不是 print_r:echo '&lt;pre&gt;', htmlentities($result), '&lt;/pre&gt;';
  • 很抱歉没有澄清,我发布的请求是原始请求。我认为这可能是我尝试使用的 API 的问题,所以我会与他们取得联系。这让我整个上午都发疯了,但我完全按照他们的文档进行操作。
  • 您的功能对我来说非常完美,无需我进行任何更改。非常感谢!

标签: php http curl


【解决方案1】:

您没有为您的 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标签。

【讨论】:

    【解决方案2】:
    echo($info['request_header']);
    

    将仅显示已发送的标头。它不会显示发布数据,因此您应该看不到 XML 字符串。

    【讨论】:

    • 有什么方法可以轻松查看发送的整个消息?
    【解决方案3】:

    当我删除标题行时它可以工作:

    //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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-09
      • 2015-12-06
      • 2022-11-29
      • 1970-01-01
      • 2017-11-21
      • 2017-04-23
      • 2020-04-26
      • 1970-01-01
      相关资源
      最近更新 更多