php cURL返回全部小写

时间:2018-02-03 19:47:12

标签: php xml curl soap

我正在连接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中返回的所有键都是小写的,并且它会破坏我的其余代码。 这曾经很好地工作到一个月前,我不知道改变了什么,但唯一可能的变化是服务器上的东西。

任何人都可以指出我为什么将响应更改为小写的正确方向?谢谢!

1 个答案:

答案 0 :(得分:0)

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

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