Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回所有小写字母的php cURL_Php_Xml_Curl_Soap - Fatal编程技术网

返回所有小写字母的php cURL

返回所有小写字母的php cURL,php,xml,curl,soap,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",

我正在连接一个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\u r
只是让我看看它返回了什么。问题是XML中返回的所有键都是小写的,这会弄乱我的其余代码。 直到一个月前,它还可以正常工作,我不知道发生了什么变化,但唯一可能的变化是服务器上的一些东西


有人能告诉我为什么答案会改成小写吗?谢谢大家!

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

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

您可以强制http版本为1.1:

curl\u setopt($ch,CURLOPT\u HTTP\u版本,curl\u HTTP\u版本1\u 1)


确保您以混合格式接收标题。

我想这可能与gzip压缩有关(压缩所有小写字符时,结果通常会稍微小一些)。您最近升级到PHP7.1+了吗?别忘了关闭curl连接(与问题无关,但值得一提)。@Daniel我同意你的观点,但这似乎只发生在我们身上,所以它是我们的服务器。而且,代码到目前为止确实有效,那么有什么变化呢?我开始认为这是与curl头有关的,但无法精确指出它,而且您确定代码中的
$xml\u post\u字符串
是相同的,并且当您手动使用SoapUI?@Zeke检查时,我不确定是否有任何服务器端更改,这是一个带有cPanel的托管VPS。我们使用的是PHP5.4.37。在所有的处理之后,curl在代码中被关闭,这只是一个大得多的类的一小部分;在我的例子中,响应头中的服务器上的所有键都是小写的,这导致了问题。在设置http版本后,它运行良好