微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 curl

如何解决使用 curl

我需要通过在 xml 中发送数据使用 post 请求方法从 api 获取一些数据。 这是我到目前为止所做的,但出现错误

function htlbycountry_get(){
    
        $url = "http://xmldemo.travellanda.com/xmlv1/";
        $ch = curl_init($url);
        $timeout = 5;
        $d = "<Request>
             <Head>
             <Username>cecd5656c336e815f69a587c69aa34cc</Username>
             <Password>3skbiOKjtaeb</Password>
             <RequestType>GetHotels</RequestType>
             </Head>
             <Body>
             <CountryCode>GB</CountryCode>
             </Body>
             </Request>";
        curl_setopt($ch,CURLOPT_POSTFIELDS,$d);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
        curl_setopt($ch,CURLOPT_HTTPHEADER,array('accept: application/xml','Content-Type: application/xml'
                                                   ));
        curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
        $rawdata = curl_exec($ch);
        print_r($rawdata);
    
    }

但我收到类似这样的响应错误

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Head>
    <ServerTime>2021-07-02T07:48:41</ServerTime>
    <ServerType>Test</ServerType>
    <ExecutionTime>0</ExecutionTime>
  </Head>
  <Body>
    <Error>
      <ErrorId>101</ErrorId>
      <ErrorText>XML request is missing. Use POST method to send the 'xml' parameter.</ErrorText>
    </Error>
  </Body>
</Response>

根据下面@Cbroe 的建议,我尝试了以下操作,但遇到相同的错误

    function htlbycountry_get(){

        $url = "http://xmldemo.travellanda.com/xmlv1/";
        $timeout = 5;
        $reqdata = "<Request><Head><Username>cecd5656c336e815f69a587c69aa34cc</Username><Password>3skbiOKjtaeb</Password><RequestType>GetHotels</RequestType></Head><Body><CountryCode>GB</CountryCode></Body></Request>";
        $data = ['xml' => $reqdata];
        $headers = array(
            "Content-type: application/x-www-form-urlencoded",);
        $ch = curl_init();
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_TIMEOUT,$timeout);
        curl_setopt($ch,CURLOPT_POST,true);
        curl_setopt($ch,$data);
        curl_setopt($ch,CURLOPT_VERBOSE,$headers);

        $rawdata = curl_exec($ch);
        print_r($rawdata);
    }

解决方法

感谢@Cbroe,我终于成功了。这是工作代码。

function htlbycountry_get(){
        $url = "http://xmldemo.travellanda.com/xmlv1/";
        $timeout = 20;
        $countrycode = $this->input->get('countrycode');
        $reqdata = "<Request><Head><Username>cecd5656c336e815f69a587c69aa34cc</Username><Password>3skbiOKjtaeb</Password><RequestType>GetHotels</RequestType></Head><Body><CountryCode>$countrycode</CountryCode></Body></Request>";
        $data = array('xml' => $reqdata);
        $headers = array(
            "Content-type: application/x-www-form-urlencoded",);
        $ch = curl_init();
        $payload = http_build_query($data);
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
        curl_setopt($ch,CURLOPT_TIMEOUT,$timeout);
        curl_setopt($ch,CURLOPT_POST,true);
        curl_setopt($ch,CURLOPT_POSTFIELDS,$payload);
        curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);

        $rawdata = curl_exec($ch);
        $xml = simplexml_load_string($rawdata);
        $json = json_encode($xml);
        print_r($json);
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。