【问题标题】:cURL adding whitespace to post content?cURL 添加空格来发布内容?
【发布时间】:2010-09-06 07:10:54
【问题描述】:

我正在尝试使用带有 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 解析器返回响应,说明:

序言中不允许的内容

我查看了该错误,这通常是由 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] 行之前和之后有可见的空白。这是导致问题的原因吗?如果是,我该如何删除它,或者我看得太远了,这可能是我要发布的服务器的问题?

【问题讨论】:

    标签: php xml curl


    【解决方案1】:

    我做了一个wc -m test.xml 并在 XML 文件中返回了 743 个字符,而 $request 上的 var_dump 返回了 742 个字符,因此trim() 中的某些内容被剥夺了(我假设)。

    我做了一个:

    print "=====" . $request . "=====";
    

    并且 XML 的开头和结尾正好与 ===== 对接,没有空格。

    【讨论】:

      【解决方案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));
      

      【讨论】:

      • 只要确保你使用: curl_setopt($curlHandle, CURLOPT_HTTPHEADER, Array("Content-Type: application/x-www-form-urlencoded; charset=utf-8"));
      【解决方案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() 检查确切的输出(包括字符串长度,以便查找丢失的内容)

      希望有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-01
        • 2016-01-30
        • 1970-01-01
        相关资源
        最近更新 更多