提问人:dragonmantank 提问时间:8/20/2008 最后编辑:dragonmantank 更新时间:1/15/2016 访问量:3575
cURL 为发布内容添加空格?
cURL adding whitespace to post content?
问:
我正在尝试使用带有 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 中重播会话时,有明显的空格。这是导致问题的原因吗,如果是这样,我该如何删除它,还是我看得太远了,这可能是我发布的服务器的问题?
答:
3赞
mercutio
8/20/2008
#1
不是答案,但我发现在查看代码时,整个 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() 检查确切的输出(包括字符串长度,以便查找缺失的内容)
希望能有所帮助
0赞
dragonmantank
8/20/2008
#2
我做了一个,并在 XML 文件中返回了 743 个字符,而 on 返回了 742 个字符,所以有些东西被剥离了(我假设)。wc -m test.xml
var_dump
$request
trim()
我做了一个:
print "=====" . $request . "=====";
XML 的开头和结尾正好对接=====,没有空格。
2赞
dragonmantank
8/21/2008
#3
事实证明,这是一个编码问题。该应用程序显然需要 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));
评论
0赞
Alex Angelico
2/20/2013
只需确保使用: curl_setopt($curlHandle, CURLOPT_HTTPHEADER, Array(“Content-Type: application/x-www-form-urlencoded;字符集=utf-8“));
评论