cURL添加空格来发布内容?
时间:2020-03-05 18:41:09 来源:igfitidea点击:
我正在尝试使用带有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解析器返回响应,说明:
Content not allowed in 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--
当我在Ethereal中重播会话时,在[SNIP]行的前后都有可见的空白。这是引起问题的原因吗?如果是,该如何解决?或者我看的太远了,这可能是我要发布服务器的问题?
解决方案
回答
这不是一个答案,但是我发现整个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个字符,而在$ request上的var_dump
返回了742个字符,因此某些东西被trim()
剥夺了(我想)。
我做了:
print "=====" . $request . "=====";
XML对接的起点和终点紧靠=====且没有空格。
回答
事实证明,这是一个编码问题。该应用程序显然需要www-form-urlencoded而不是form-data的XML,所以我不得不更改:
# 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));