CURL不将数据发布到URL

时间:2015-10-20 11:48:30

标签: php curl encoding

我有一个简单的表单,我想将其转换为PHP后端系统。

现在,此表单有一个提交到URL的操作 - 只有在提交名称为postdata且提交了正确信息的数据(已编码的xml)时,URL才会接受邀请。

作品 - 请注意,输入名称为postdata,值包含xmlurlencoded并且效果非常好。

<form name="nonjava" method="post" action="https://url.com">
    <input name="postdata" id="nonjavapostdata" type="hidden" value="&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;" />
    <button type="submit" name="submit">Button</button>
</form>

但是,我希望通过在PHP中移动postdata元素来实现以下目的,因为通过这种方式传递了大量信息。

请注意:该链接是https,但它无法在本地工作,所以我不得不在CURL中禁用它。

<?php
    $url = 'https://super.com';
    $xmlData = '<?xml version="1.0" encoding="utf-8"?>
    <postdata
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:xsd="http://www.w3.org/2001/XMLSchema">
         <api>2</api>
    </postdata>';

    $testing = urlencode($xmlData);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, "postdata=" . $testing);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
    curl_setopt($ch, CURLOPT_VERBOSE, true);

    $response = curl_exec($ch);

    // Then, after your curl_exec call:
    $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    $header = substr($response, 0, $header_size);
    $body = substr($response, $header_size);

    echo $header_size . '<br>';
    echo htmlspecialchars($header) . '<br>';
    echo htmlspecialchars($body) . '<br><br>';

    $http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    echo "$http_status for $url <br>";
?>

我一直收到302错误(这是网址内容未找到数据,因此会重定向到未找到的网页。)

3 个答案:

答案 0 :(得分:0)

302不是错误;它只是意味着您需要转到重定向的URL。浏览器会自动为您执行此操作。在PHP代码中,您必须自己完成。查看302上的Location标题。

我试图查看是否有一种方法可以告诉Curl遵循重定向;许多语言HTTP库都支持它。这个主题似乎表明CuRL也支持它 - Is there a way to follow redirects with command line cURL

答案 1 :(得分:0)

您的代码按预期工作,我正在获取POST数据:

Array ( [postdata] => <?xml version="1.0" encoding="utf-8"?> <postdata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/20 01/XMLSchema"> <api>2</api> </postdata> )

结果是

。问题出在接收方,它没有正确处理它。

答案 2 :(得分:0)

你需要在curl中遵循302重定向。通过添加位置标志,这相对容易。 vapply(file_names, pdf_pages, numeric(1)) 这相当于在CLI中执行curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 。您可以在php文档中看到示例here