我正在尝试使用带有cURL的PHP 5.2对供应商的服务器进行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解析器返回响应,说明:
prolog中不允许的内容
我查看了错误,这通常是由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--
在[SNIP]行之前和之后,当我在Ethereal中重放会话时,会出现可见的空白。这是导致问题的原因,如果是这样,我该如何删除它,或者我看得太远,这可能是我发布的服务器的问题?
答案 0 :(得分:3)
不是答案,但我发现在查看代码时,整个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()检查确切的输出(包括字符串长度,以便查找丢失的内容)
希望有所帮助
答案 1 :(得分: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));
答案 2 :(得分:0)
我做了wc -m test.xml
并在XML文件中返回了743个字符,而var_dump
上的$request
又返回了742个字符,因此有些内容被trim()
剥离了(我假设)。
我做了一个:
print "=====" . $request . "=====";
并且XML的开头和结尾正对着=====,没有空格。