【问题标题】:PHP CURL is not sending xml in post methodPHP CURL 不在 post 方法中发送 xml
【发布时间】:2015-03-24 12:35:11
【问题描述】:

我正在尝试使用他们的 API 文档与电信运营商联系。

我需要向他们发送 XML 请求(在 POST 中)以及 GET 方法中的一些凭据。

我构建了我的脚本并发布了 XML,但他们说他们没有收到任何 xml。

<?php
$url = "http://<IP>:<PORT>/C2SReceiver?LOGIN=abc&PASSWORD=123";
$xml = '<?xml version="1.0"?>
        <COMMAND>
            <TYPE>k59</TYPE>
            <DATE>19/03/2015 23:20:20</DATE>
            <PIN>11000009</PIN>
            <LOGINID>abc</LOGINID>
            <PASSWORD>123</PASSWORD>
            <EXTCODE>0100</EXTCODE>
            <EXTREFNUM>1230567890</EXTREFNUM>
        </COMMAND>';

    $headers = array(
        "Content-type: text/xml",
        "Content-length: " . strlen($xml),
        "Connection: close",
    );
    // configure
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

    // requesting
    $data = curl_exec($ch); 
    // displaying response in XML
    echo $data;
    if(curl_errno($ch))
        print curl_error($ch);
    else
        curl_close($ch);
?>

当我发送请求时,他们的系统说:“来自 HashMap 的消息格式无效

他们说,他们只是通过 get 方法获取参数。他们没有收到任何 XML。

请注意::如果我改变了xml格式,他们的系统会响应“Invalid XML”。

如果他们没有得到我的 XML,他们怎么能说它无效。

我已经浪费了一整天的时间来解决这个问题。不知道出了什么问题。请看一下,并建议我从头到尾能做什么。

谢谢。

【问题讨论】:

  • 不要手动添加内容长度标头,搞砸的机会很大,如果你不手动添加,curl会自动处理,而cURL搞砸的机会是比你搞砸的机会要小得多
  • 也不要添加 "Connection: close" 标头,应该设置 CURLOPT_FORBID_REUSE=>true ,这就是它存在的原因,我相信
  • 我删除了内容长度,仍然是同样的错误。还有其他可能的解决方法吗?
  • 我删除了连接:关闭,还是同样的错误。
  • 是的,您有任何实际可行的实现吗?监控它,使用防火墙或 Fiddler 代理(如果它的 SSL/TLS 加密,fiddler 有一个很好的中间人攻击来监控这个流量的解密版本,应用程序不会注意到),或者 WPE Pro,然后监控自己的 curl 实现并比较差异,肯定有什么不同,找出什么

标签: php xml curl


【解决方案1】:

尝试从 text/xml -> application/xml 更改标题内容类型。在执行 HTTP 请求时在我的 CURLOPT_HTTPHEADER 上:

    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/xml'));

【讨论】:

  • 试过但同样的反应。
【解决方案2】:

您的代码没有任何错误。我测试到最后,我在 C2SReceiver.php 文件中获得了 xml 格式数据。我只是使用此代码获取 xml 格式数据。

<?php $x = new SimpleXmlElement(file_get_contents('php://input')); print_r($x);die(); ?>

<?php $x = new SimpleXmlElement(file_get_contents('php://input')); print_r($x);die(); ?>

用于获取curl传递的C2SReceiver.php中的xml数据

【讨论】:

  • 用于获取 curl 传递的 C2SReceiver.php 中的 xml 数据
猜你喜欢
  • 2018-06-13
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 2021-05-05
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多