我正在尝试使用 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 的开头和结尾紧靠 =====,没有空格。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top