【问题标题】:PHP cURL not working for sending POST request to apiPHP cURL 无法向 api 发送 POST 请求
【发布时间】:2017-08-21 06:37:30
【问题描述】:

我正在尝试将发布请求发送到 SMS api 并使用 PHP 和 cURL 从他们那里接收反馈。但是,当我尝试通过表单发送相同的数据时,cURL 对我不起作用。

$POST = array(
            'data' => $xml1

    );
$url = 'URL';
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_POST, true );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $POST );
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
$result = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
echo "<input type=\"textarea\" id=\"txt\"  style='width:600px' value='$result'></input>";
echo "<input type=\"textarea\" id=\"txt1\" name='data1' style='width:600px' value='".$info['request_header']."'></input>";

XML 是

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE MESSAGE SYSTEM "http://127.0.0.1:80/psms/dtd/messagev12.dtd">
<MESSAGE VER="1.2">
<USER USERNAME="abc" PASSWORD="pqr" />
<SMS UDH="0" CODING="1" TEXT="SMS TEXT" PROPERTY="0" ID="1" TEMPLATE="" EMAILTEXT="" ATTACHMENT=""><ADDRESS FROM="someone" TO="91xxxxxxxxxx" EMAIL="" SEQ="1" TAG="some clientside random data"/>
</SMS>
</MESSAGE>

但是使用表格可以正常工作,表格代码

echo "<form action=\"URL\" method=\"POST\" target=\"_blank\">";

    echo "<input type=\"textarea\" id=\"txt\" name='data' style='width:600px' value='$xml1'></input>";
    echo "<input type=\"SUBMIT\" name=\"action\" value=\"send\">";
    echo "</form>";

当我使用表单发送数据时,它显示已发送状态,但是当我使用 curl 发送时,它显示输出为:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <MESSAGEACK>
    <Err Code="65535" Desc="The Specified message does not conform to DTD"/>
</MESSAGEACK> 

谢谢

【问题讨论】:

  • 我可以看到的第一个区别是您在 curl $POST 数据中缺少 "action" =&gt; "send"。您的 curl 版本还将请求 content-type 标头设置为“multipart/form-data”
  • @Phil 我将内容类型更改为 text/xml 并添加了 action = send ,但仍然显示相同的错误
  • &lt;form&gt; 版本会将内容类型设置为application/x-www-form-urlencoded,而不是text/xml
  • 尝试将SSL_VERIFYPEER设置为false,如curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  • @Phil 试过了,没有运气

标签: php api curl post


【解决方案1】:

而不是创建数组。

$POST = array('data' => $xml1);

只需$POST =&gt; $xml1

【讨论】:

    【解决方案2】:

    你是如何设置$xml1变量的?

    确保您使用的是$xml1 = file_get_contents($xmlFilepath) 而不是simplexml_load_file($xmlFilepath)

    【讨论】:

    • 我使用php和mysql动态生成xml,所以$xml1只是一个包含xml的变量
    • 那么,$xml1 数据类型是 SimpleXMLElement 对象还是字符串?
    • 它的字符串不是 SimpleXMLElement 对象
    • 试试这条线:{curl_setopt( $ch, CURLOPT_POSTFIELDS, "data=".$xml1."&amp;action=send" );}
    猜你喜欢
    • 2012-08-31
    • 2016-03-08
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 2014-07-28
    相关资源
    最近更新 更多