【问题标题】:cURL giving 400 in response [duplicate]cURL 给出 400 作为响应 [重复]
【发布时间】:2013-03-30 00:15:35
【问题描述】:

您好,任何愿意帮助的人.. 我不知道还能做什么。我正在尝试向 api 发送一个 xml 请求,该 api 将返回一个 xml 格式的响应。我正在使用 curl 来实现它。但无论我以何种方式格式化我的请求,我总是得到 400 响应。网址格式正确。这是我的代码:

$ch1 = curl_init(); 
    $fp1 = fopen('poi.xml','w'); 
    curl_setopt($ch1, CURLOPT_URL, "http://api.ean.com/ean-services/rs/hotel/v3/geoSearch?cid=55505&minorRev=14&apiKey=xkr94zxbsjnzczryqajmjg3g&locale=en_US&currencyCode=USD&customerIpAddress=189.214.86.135&customerUserAgent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31&xml=<LocationInfoRequest><destinationString>Dallas, TX</destinationString><type>2</type></LocationInfoRequest>");  
    curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch1, CURLOPT_HTTPHEADER, array('Accept: application/xml'));
    curl_setopt($ch1, CURLOPT_HEADER, 0); 
    curl_setopt($ch1, CURLOPT_FILE, $fp1);
    curl_setopt($ch1, CURLOPT_CUSTOMREQUEST, 'GET');
    curl_setopt($ch1, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)'); 
    $val1 = curl_exec($ch1);
    $info = curl_getinfo($ch1);
    echo '<pre>';
      print_r($info);
      echo '</pre>';
    curl_close($ch1);//Close curl session 
    fclose($fp1); //Close file overwrite 
    $avail = simplexml_load_file('poi.xml');

这是我从 curl 得到的信息:

[url] => http://api.ean.com/ean-services/rs/hotel/v3/geoSearch?cid=55505&minorRev=14&apiKey=xkr94zxbsjnzczryqajmjg3g&locale=en_US¤cyCode=USD&customerIpAddress=189.214.86.135&customerUserAgent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31&xml=Dallas, TX2
[content_type] => text/html
[http_code] => 400
[header_size] => 158
[request_size] => 558
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0.075402
[namelookup_time] => 0.038232
[connect_time] => 0.055687
[pretransfer_time] => 0.055787
[size_upload] => 0
[size_download] => 349
[speed_download] => 4628
[speed_upload] => 0
[download_content_length] => 349
[upload_content_length] => 0
[starttransfer_time] => 0.07531
[redirect_time] => 0

我做错了什么?任何帮助将不胜感激。

【问题讨论】:

  • 我对 curl 不太熟悉,但是根据我的经验,使用命令 curl -O http://url_to_your_api_call 应该可以工作,这将获得 xml,然后您可以选择处理任何您选择的内容
  • 感谢您的回复,但我不明白我应该把它放在哪里。您能否从我的代码中获取它以更好地理解?谢谢
  • 我可以先帮助您,您是否尝试在调用脚本的同一工作目录中查看 poi.xml?正如 curl 告诉你的 400 响应是 http 代码,这意味着你有一个错误的请求(格式不正确)这种格式特定于你的 api(我不知道)
  • 还有更多:400 - Bad Request in Curl 的可能重复项; Problem fetching XML data using Expedia API and curl 的可能重复项;使用更少代码的可能替代方法:Using SimpleXML to load remote URL

标签: php xml http curl


【解决方案1】:

不禁注意到您正在联系的 URL 中的 XML 代码。

你确定它应该在那里吗?

如果是,您可能需要对其进行正确的 URL 编码。代码 400 表示您尝试访问的 URL 不存在。由于返回的 url 与您发送的 url 不匹配,这将指向正确。

【讨论】:

    【解决方案2】:

    您面临的问题与 curl 的关系不大,而与您使用的 URL 的关系更大:

    http://api.ean.com/ean-services/rs/hotel/v3/geoSearch?cid=55505&amp;minorRev=14&amp;apiKey=xkr94zxbsjnzczryqajmjg3g&amp;locale=en_US&amp;currencyCode=USD&amp;customerIpAddress=189.214.86.135&amp;customerUserAgent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31&amp;xml=&lt;LocationInfoRequest&gt;&lt;destinationString&gt;Dallas, TX&lt;/destinationString&gt;&lt;type&gt;2&lt;/type&gt;&lt;/LocationInfoRequest&gt;

    网址无效,包含特殊字符,例如空格字符。

    您需要正确构建它,PHP 可以通过为您正确编码所有内容的 http_build_query() 函数为 URL 查询参数使用一些变量和数组来帮助您:

    // create api.ean.com request URL:
    $url = 'http://api.ean.com/ean-services/rs/hotel/v3/geoSearch?' . http_build_query(array(
        'cid'               => '55505',
        'minorRev'          => '14',
        'apiKey'            => 'xkr94zxbsjnzczryqajmjg3g',
        'locale'            => 'en_US',
        'currencyCode'      => 'USD',
        'customerIpAddress' => '189.214.86.135',
        'customerUserAgent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31',
        'xml'               => '<LocationInfoRequest><destinationString>Dallas, TX</destinationString><type>2</type></LocationInfoRequest>',
    ));
    

    你需要做的就是将它传递给 curl:

    $ch1 = curl_init();
    ...
    curl_setopt($ch1, $url);  
    
    # or just:
    
    $ch1 = curl_init($url);
    

    这应该可以解决您在请求 URL 方面遇到的问题。请求可能还有更多问题/其他错误。当您使用 curl 时,您可能会发现 Php - Debugging CurlBad Request. Connecting to sites via curl on host and system 中列出的信息为好吧。

    【讨论】:

      猜你喜欢
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      • 2015-04-28
      • 2021-03-02
      • 1970-01-01
      相关资源
      最近更新 更多