gpt4 book ai didi

php - 响应XML包含 “2000 ”和 “20a0”字符

转载 作者:行者123 更新时间:2023-12-03 12:05:12 26 4
gpt4 key购买 nike

我有一个使用PHP发送的WebDAV Profind请求。 HTTP请求如下所示:

PROPFIND /path/to/whatever HTTP/1.1
User-Agent: My Client
Accept-Encoding: deflate
Depth: 1
Host: example.com
Content-Type: text/xml;charset=UTF-8
Authorization: Basic bLahDeBlah=
Content-Length: 82
Connection: close

<?xml version='1.0' encoding='utf-8'?><propfind xmlns='DAV:'><allprop/></propfind>

当响应XML小于约1.5 MB时,它可以正常工作。当响应较大时,XML包含诸如 \r\n2000\r\n和偶尔的 \r\n20a0\r\n之类的字符。

我正在使用以下PHP代码来检索响应:
<?php
$output = "";
while (!feof($this->socket)) {
$output .= fgets($this->socket, 1024);
}

我可以通过从响应中删除不需要的字符来解决此问题-但我想防止这种情况。知道是什么原因造成的吗?

更新:响应头包含 Transfer-Encoding: chunked。我们的PHP版本是Windows,我相信没有DLL可以使用 http_chunked_decode()

最佳答案

正如一些人已经在注释中指出的那样,由于响应为chunked-encoded,所以插入了“十六进制”字符。

This stack-overflow question处理相同的问题(不使用PECL扩展名),并建议使用以下代码片段对响应进行解码:

function decode_chunked($str) {
for ($res = ''; !empty($str); $str = trim($str)) {
$pos = strpos($str, "\r\n");
$len = hexdec(substr($str, 0, $pos));
$res.= substr($str, $pos + 2, $len);
$str = substr($str, $pos + 2 + $len);
}
return $res;
}

如链接问题中指出的那样,在应用解码之前,请确保已设置头 Transfer-Encoding: chunked

更新:Zend-Framework具有 Response类,该类也支持分块解码。请注意,Zend\Http类可以用作独立组件(无需在您的应用程序中包含完整的框架!)。

关于php - 响应XML包含 “2000 ”和 “20a0”字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25971067/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com