CURL 未将数据发布到 URL

Posted

技术标签:

【中文标题】CURL 未将数据发布到 URL【英文标题】:CURL not posting data to URL 【发布时间】:2016-01-19 01:34:03 【问题描述】:

我有一个简单的表单,我想将它转换成 php 后端系统。

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

工作原理: - 请注意,输入名称称为postdata,值包含xml,它一直是urlencoded,并且工作正常。

<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 错误(这是 url 内容未找到数据,因此重定向到未找到的页面。)

【问题讨论】:

我认为您正在寻找 CURLOPT_FOLLOWLOCATION 卷曲标志 【参考方案1】:

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

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

【讨论】:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);【参考方案2】:

您的代码按预期工作,我正在获取 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> )

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

【讨论】:

差不多 - 发布数据,即 xml 数据需要 htmlencoded 并发送到 url。如前所述,代码的 HTML 版本无需任何 php 即可完美运行。 不确定您要达到的目标是什么?也许您想在上面调用 htmlentites:$testing = urlencode(htmlentities($xmlData));【参考方案3】:

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

【讨论】:

以上是关于CURL 未将数据发布到 URL的主要内容,如果未能解决你的问题,请参考以下文章

打开 UI webview 时,RestKit 未将 URL 添加到后退列表

Simogeo 文件管理器未将图像 url 返回到 ckeditor

Laravel 中的 Ajax Jquery 未将值保存到数据库

休眠错误配置:未将工厂绑定到 JNDI,未配置 JNDI 名称

URL 未将参数传递给 s-s-rS 报告

React 和 Node 应用程序未将图像上传到 Cloudinary,404 错误没有解释