【问题标题】:API URL call with PHP and cURL使用 PHP 和 cURL 调用 API URL
【发布时间】:2017-11-18 02:31:03
【问题描述】:

希望有人能帮帮我。

我有一个使用此 URL 的 API 调用。

https://192.168.11.234:4444/webconsole/APIController?reqxml=<Request><Login<Username>XXXXX</Username><Password>XXXXX></Password></Login><Get><User><Username>manager</Username></User></Get></Request>

这可以正常工作并按预期返回 XML。

但是我试图用 PHP 和 cURL 做同样的事情。

我对 cURL 的经验很少

到目前为止,我已经尝试过这种方法的变体,但没有得到任何回应。只有一个空白页。想知道是否有人可以帮助我。

<?php
$input_xml = '<Request><Login><Username>XXXX</Username><Password>XXXX</Password></Login><Get><User></User></Get></Request>';
$url = "https://192.168.11.234:4444/webconsole/APIController";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_POSTFIELDS,
            "reqxml=" . $input_xml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 300);
$data = curl_exec($ch);
curl_close($ch);

$array_data = json_decode(json_encode(simplexml_load_string($data)), true);

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

我承认我没有经常使用 cURL,所以我可能会走得更远。

【问题讨论】:

    标签: php xml api curl


    【解决方案1】:

    我爱你们(或女孩) 这有效:

    <?php
    $input_xml = '<Request><Login><Username>XXXXX</Username><Password>XXXXXX</Password></Login><Get><User></User></Get></Request>';
    $url = "https://192.168.11.234:4444/webconsole/APIController";
    $ch = curl_init();
    $headers = [ 
        "Content-type: text/xml;charset=\"utf-8\"", 
        "Accept: text/xml", 
        "Content-length: ".strlen($xml_data)
    ]; 
    
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    
            curl_setopt($ch, CURLOPT_URL, $url."?reqxml=" . urlencode($input_xml));
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 300);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
               if (curl_error($ch)) {
               echo 'error:' . curl_error($ch);
                }
            $data = curl_exec($ch);
            var_dump($data);
            curl_close($ch);
    
    
            $array_data = json_decode(json_encode(simplexml_load_string($data)), true);
    
            print_r('<pre>');
            print_r($array_data);
            print_r('</pre>');
    ?>
    

    以为我已经接近了,设置了正确的标题,然后更改:

    curl_setopt($ch, CURLOPT_URL, $url);
    

    收件人:

    curl_setopt($ch, CURLOPT_URL, $url."?reqxml=" . urlencode($input_xml));
    

    是什么帮助。非常感谢您的帮助!

    【讨论】:

    【解决方案2】:

    当您尝试以下操作时会得到什么:

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

    编辑: 哦,还有 CURLOPT_POST = true

    【讨论】:

      【解决方案3】:

      删除POSTFIEILDS 行并用此替换URL

      curl_setopt($ch, CURLOPT_URL, $url."?reqxml=" . urlencode($input_xml));
      

      应该可以的。

      【讨论】:

        【解决方案4】:

        1) 如果您的服务器不接受 POST 请求,则删除此行:

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

        并添加:

        curl_setopt($ch, CURLOPT_URL, $url.'?reqxml='.urlencode($input_xml));
        

        在 GET 请求中发送数据。

        2) 设置正确的 HTTP 标头:

        $headers = [ 
            "Content-type: text/xml;charset=\"utf-8\"", 
            "Accept: text/xml", 
            "Content-length: ".strlen($xml_data)
        ]; 
        
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        

        3) 要查看可能的错误,请在$data = curl_exec($ch); 行之前添加这些行:

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        if (curl_error($ch)) {
            echo 'error:' . curl_error($ch);
        }
        

        4) 您还需要添加对simplexml_load_string 的检查,因为它在失败时返回false

        if (simplexml_load_string($data) === false) {
        // do something
        }
        

        如果我的回答对你有帮助,请告诉我。

        【讨论】:

          猜你喜欢
          • 2014-11-15
          • 2020-02-29
          • 1970-01-01
          • 2023-04-10
          • 2018-01-21
          • 1970-01-01
          • 2015-07-08
          • 1970-01-01
          • 2019-02-13
          相关资源
          最近更新 更多