首页 > 解决方案 > xml 的 CURL 命令无法通过 php 脚本发送

问题描述

我已经使用这个 linux 命令发送 xml CURL 请求

curl -f -d 
           '<REQ>
               <FEATURE>COMMON</FEATURE>
               <TIME-STAMP>ddmmyyyy HH:MM:SS</TIME-STAMP>
               <OPERATION-CODE>DEACTIVATE</OPERATION-CODE>
               <CLIENT-TRANS-ID>3256778901</CLIENT-TRANS-ID>
               <BODY>
                  <DATASET>
                     <PARAM>
                        <NAME>PRODUCT-CODE</NAME>
                        <VALUE>T-1234</VALUE>
                     </PARAM>
                     <PARAM>
                        <NAME>CP-ID</NAME>
                        <VALUE>111</VALUE>
                     </PARAM>
                     <PARAM>
                        <NAME>CHANNEL-ID</NAME>
                        <VALUE>WAP</VALUE>
                     </PARAM>
                     <ADDITIONAL-PARAM>
                        <PARAM>
                           <NAME>LANGUAGE</NAME>
                           <VALUE>1</VALUE>
                        </PARAM>
                        <PARAM>
                           <NAME>KEYWORD</NAME>
                           <VALUE>LS</VALUE>
                        </PARAM>
                     </ADDITIONAL-PARAM>
                  </DATASET>
               </BODY>
            </REQ>' 
           'http://192.168.xx.xxx:8088/HttpAdapter'

它工作正常。

但是当我尝试使用 PHPI 时出现错误

$input_xml = "<REQ>
               <FEATURE>COMMON</FEATURE>
               <TIME-STAMP>ddmmyyyy HH:MM:SS</TIME-STAMP>
               <OPERATION-CODE>DEACTIVATE</OPERATION-CODE>
               <CLIENT-TRANS-ID>3256778901</CLIENT-TRANS-ID>
               <BODY>
                  <DATASET>
                     <PARAM>
                        <NAME>PRODUCT-CODE</NAME>
                        <VALUE>T-1234</VALUE>
                     </PARAM>
                     <PARAM>
                        <NAME>CP-ID</NAME>
                        <VALUE>111</VALUE>
                     </PARAM>
                     <PARAM>
                        <NAME>CHANNEL-ID</NAME>
                        <VALUE>WAP</VALUE>
                     </PARAM>
                     <ADDITIONAL-PARAM>
                        <PARAM>
                           <NAME>LANGUAGE</NAME>
                           <VALUE>1</VALUE>
                        </PARAM>
                        <PARAM>
                           <NAME>KEYWORD</NAME>
                           <VALUE>ls</VALUE>
                        </PARAM>
                     </ADDITIONAL-PARAM>
                  </DATASET>
               </BODY>
            </REQ>
            ";

            $url = "http://192.168.xx.xxx:8088/HttpAdapter";

            //setting the curl parameters.
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                                            'Content-Type: application/xml',
                                            'Connection: Keep-Alive'
                                            ));
            curl_setopt($ch, CURLOPT_URL, $url);
            // Following line is compulsary to add as it is:
            curl_setopt($ch, CURLOPT_POSTFIELDS,
                        "xmlRequest=" . $input_xml);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 300);
            $data = curl_exec($ch);
            curl_close($ch);

            //convert the XML result into array
            $array_data = json_decode(json_encode(simplexml_load_string($data)), true);

            print_r('<pre>');
            print_r($array_data);
            print_r('</pre>');

这次我收到“5689 featureID not sent with the request”。错误代码是 1003。我的 PHP 代码没有任何错误。如何使用 php CURL 发送此 xml 请求。

标签: phpxmlcurl

解决方案


您的 php 代码xmlRequest=添加到 POST 正文中,而您的 curl 代码没有。只需更换

curl_setopt($ch, CURLOPT_POSTFIELDS, "xmlRequest=" . $input_xml);

curl_setopt($ch, CURLOPT_POSTFIELDS, $input_xml);

并且请求应该大致相似(不完全相似,例如,命令行 curl 有一个看起来像的默认用户代理User-Agent: curl/7.63.0,而 libcurl 以及扩展的 php 的 curl_* api 没有默认用户代理,但是您可以使用 CURLOPT_USERAGENT 设置一个)

..这些示例也不应该起作用,因为您在两种情况下都发送了错误的 Content-Type 标头,您正在发送

Content-Type: application/x-www-form-urlencoded

但正确的类型应该是:

Content-Type: application/xml

..我猜服务器只是忽略了 Content-Type 标头,因为您的 curl 调用确实有效。除非明确记录,否则这可能是一个错误,您可能应该让服务器开发人员知道。


推荐阅读