【问题标题】:php cURL returning all lowercasephp cURL 返回全部小写
【发布时间】:2018-07-14 01:19:20
【问题描述】:

我正在连接一个 API,需要检索 XML 数据。我得到了响应,但问题是所有键都是小写的。如果我使用 SoapUI 测试请求,它会按预期响应,因此我将其范围缩小到我的服务器和我的代码。这是我的要求:

$headers = array(
        "Content-type: text/xml;charset=\"utf-8\"",
        "Accept: text/xml",
        "Cache-Control: no-cache",
        "Pragma: no-cache",
        "SOAPAction: http://XYZDOMAIN.com.au/" . $func,
        "Content-length: " . strlen($xml_post_string),
        "Accept-Encoding: gzip,deflate"
    ); //SOAPAction: your op URL
    // PHP cURL  for https connection with auth

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
    curl_setopt($ch, CURLOPT_URL, $this->url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_post_string); // the SOAP request
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
    curl_setopt($ch, CURLOPT_ENCODING, "gzip,deflate");

    $response = curl_exec($ch);

    if ($errno = curl_errno($ch)) {
        $error_message = curl_strerror($errno);
        echo "cURL error ({$errno}):\n {$error_message}";
    }

    $return = gzdecode($response);

    print_r($return);

当然,最后的print_r 只是为了让我看看它返回什么。问题是 XML 中返回的所有键都是小写的,它弄乱了我的其余代码。 这在一个月前之前还可以正常工作,我不知道发生了什么变化,但唯一可能的变化是服务器上的一些东西。

谁能指出我为什么将响应更改为小写的正确方向?谢谢!

【问题讨论】:

  • 我想这可能与 gzip 压缩有关(压缩所有小写字符时结果通常会略小)
  • 您最近升级到 PHP 7.1+ 了吗?并且不要忘记关闭 curl 连接(与问题无关,但值得注意)。
  • @Daniel 我和你在一起,但这似乎只发生在我们身上,所以它是我们的服务器。另外,代码到现在都有效,所以发生了什么变化?我开始认为这是卷曲标题的问题,但无法确定它
  • 你确定$xml_post_string在你的代码中是相同的,当你手动检查SoapUI时?
  • @Zeke 我不确定是否有任何服务器端更改,它是带有 cPanel 的托管 VPS。我们使用的是 php 5.4.37。 curl 在所有处理之后在代码中稍后关闭,这只是一个更大的类的一小部分。

标签: php xml curl soap


【解决方案1】:

PHP 版本使用 HTTP 2 而不是 1.1,并且 HTTP 2 规范要求标头小写。所以这似乎是造成差异的原因。

https://httpwg.org/specs/rfc7540.html#HttpHeaders - “就像在 HTTP/1.x 中一样,标头字段名称是 ASCII 字符的字符串,它们以不区分大小写的方式进行比较。但是,标头字段名称必须在编码之前转换为小写字母HTTP/2。包含大写标头字段名称的请求或响应必须被视为格式错误(第 8.1.2.6 节)。”

您可以强制 http 版本为 1.1:

curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);

以确保您收到混合大小写的标题。

【讨论】:

  • 工作正常;在我的情况下,在服务器响应标头中,所有键都是小写的,这会导致问题。设置http版本后效果很好
猜你喜欢
  • 2014-03-27
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 2018-10-05
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多