题
我正在尝试使用 PHP 5.2 和 cURL 对供应商的服务器进行 POST。我正在读取 XML 文档以针对其服务器发布,然后读取响应:
$request = trim(file_get_contents('test.xml'));
$curlHandle = curl_init($servletURL);
curl_setopt($curlHandle, CURLOPT_POST, TRUE);
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, array('XML'=>$request));
curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curlHandle, CURLOPT_HEADER, FALSE); # Have also tried leaving this out
$response = curl_exec($curlHandle);
该代码本身工作正常,但另一个服务器从它的 XML 解析器返回一个响应,指出:
序言中不允许出现的内容
我查看了该错误,这通常是由 XML 之前的空格引起的,但我确保 XML 文件本身没有空格,并且 trim() 应该清除它。当我运行代码时,我在连接上执行了 TCPDump,这就是发送的内容:
POST {serverURL} HTTP/1.1
Host: {ip of server}:8080
Accept: */*
Content-Length: 921
Expect: 100-continue
Content-Type: multipart/form-data; boundry:---------------------------01e7cda3896f
---------------------------01e7cda3896f
Content-Disposition: form-data; name="XML"
[SNIP - the XML was displayed]
---------------------------01e7cda3896f--
当我在 Ethereal 中重播会话时,[SNIP] 行之前和之后有可见的空白。这是导致问题的原因吗?如果是,我该如何删除它,还是我看得太远了,这可能是我发布的服务器的问题?
解决方案 2
事实证明这是一个编码问题。该应用程序显然需要 www-form-urlencoded 中的 XML 而不是 form-data,所以我必须更改:
# This sets the encoding to multipart/form-data
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, array('XML'=>$request));
到
# This sets it to application/x-www-form-urlencoded
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, 'XML=' . urlencode($request));
其他提示
不是答案,但我发现在查看代码时,整个 fopen/fread/fclose 的内容非常乏味。
您可以替换:
$file = 'test.xml';
$fileHandle = fopen($file, 'r');
$request = fread($fileHandle, filesize($file));
fclose($fileHandle);
$request = trim($request);
和:
$request = trim(file_get_contents('test.xml'));
但无论如何 - 对于你的问题;如果这些是正在发送的标头,那么远程服务器应该不会有问题。尝试更改 xml 文件的内容并使用 var_dump() 检查确切的输出(包括字符串长度,以便您可以查找丢失的内容)
希望有帮助
我做了一个 wc -m test.xml
返回 XML 文件中的 743 个字符 var_dump
在 $request
返回 742 个字符,因此某些内容被删除 trim()
(我假设)。
我做了一个:
print "=====" . $request . "=====";
XML 的开头和结尾紧靠 =====,没有空格。
不隶属于 StackOverflow