【问题标题】:400 - Bad Request in Curl [closed]400-Curl中的错误请求[关闭]
【发布时间】:2012-12-07 14:03:46
【问题描述】:

当我尝试向 php 中的服务器发送请求时,我似乎遇到了问题。 http api 请求是这样的:

http://api.ean.com/ean-services/rs/hotel/v3/avail?minorRev14&apiKey=p9ycn9cxb2zp3k3gfvbf5aym&cid=55505&locale=en_US&hotelId=122212&stateProvinceCode=%20NV%C2%A4cyCode=USD&arrivalDate=12/27/2012&departureDate=12/28/2012&room1=2,&room2=2,18,15&room3=3,16,16,15&room4=3,&includeDetails=true&includeRoomImages=true

我的 php 代码中有以下部分,我认为错误正在发生:

$url = 'http://api.ean.com/ean-services/rs/hotel/v3/avail?minorRev14';
$url .= '&apiKey=p9ycn9cxb2zp3k3gfvbf5aym';
$url .= '&cid=55505';
$url .= '&locale=' . $locale . '&hotelId=' . $hotelid . '&stateProvinceCode=' . $state . '&currencyCode=USD';

$url .= '&arrivalDate=' . $datefr . '&departureDate=' . $dateto . '&' . $details . '&includeDetails=true&includeRoomImages=true';
$header = "Accept: application/json";

$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_ENCODING, "gzip");
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$retValue = curl_exec($ch);
$response = json_decode(curl_exec($ch));
$ee       = curl_getinfo($ch);
print_r($ee);

print_r($retValue);

这是我从 print_r(curl_getinfo($ch)) 语句中得到的:

Array (
    [url] => http://api.ean.com/ean-services/rs/hotel/v3/avail?minorRev14&apiKey=p9ycn9cxb2zp3k3gfvbf5aym&cid=55505&locale=en_US&hotelId=122212&stateProvinceCode= NV¤cyCode=USD&arrivalDate=12/27/2012&departureDate=12/28/2012&room1=2,&room2=2,18,15&room3=3,16,16,15&room4=3,&includeDetails=true&includeRoomImages=true
    [content_type] => text/html
    [http_code] => 400
    [header_size] => 181
    [request_size] => 340
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.469
    [namelookup_time] => 0
    [connect_time] => 0.125
    [pretransfer_time] => 0.125
    [size_upload] => 0
    [size_download] => 349
    [speed_download] => 744
    [speed_upload] => 0
    [download_content_length] => 349
    [upload_content_length] => 0
    [starttransfer_time] => 0.469
    [redirect_time] => 0
    [certinfo] => Array ( )
    [redirect_url] =>
)

我不确定解决方案是什么,我一直在研究这个问题有一段时间了,希望有人可以帮助我,谢谢:)

【问题讨论】:

    标签: php curl


    【解决方案1】:

    添加

    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)');
    

    通过这种方式,它可以告诉它什么类型的代理(浏览器、蜘蛛等)正在请求内容。

    所以最后,我将你的代码修改为

    <?php 
    $url ='http://api.ean.com/ean-services/rs/hotel/v3/avail?minorRev14&apiKey=p9ycn9cxb2zp3k3gfvbf5aym&cid=55505&locale=en_US&hotelId=122212&stateProvinceCode=%20NV%C2%A4cyCode=USD&arrivalDate=12/27/2012&departureDate=12/28/2012&room1=2,&room2=2,18,15&room3=3,16,16,15&room4=3,&includeDetails=true&includeRoomImages=true';
    
    $header = array("Accept: application/json");
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt($ch, CURLOPT_ENCODING, "gzip");
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)');
    
    $retValue = curl_exec($ch);
    $response = json_decode(curl_exec($ch));
    $ee       = curl_getinfo($ch);
    print_r($ee);
    
    print_r($retValue);
    ?>
    

    它对我来说很好用。你也可以检查一下吗?

    【讨论】:

    • @Leigh 添加了解释,在 CURLOPT_USERAGENT 中,'USERAGENT' 是自我解释
    • @Leigh 这是因为一些服务器会阻止蜘蛛/爬虫或机器人并且只允许浏览器
    • 这是您应该首先添加到答案中的信息。不仅仅是一行代码。
    • 谢谢我现在检查一下
    • 对不起 user7282 我遇到了同样的错误..
    【解决方案2】:

    有一些奇怪的地方:

    &stateProvinceCode=%20NV%C2%A4cyCode=USD

                     ^^^^^^^^^^^^^^^^^^^
    

    Converting it to plain ascii,它的“NV¤cyCode”

    从我的观点来看应该是这样的

    &stateProvinceCode=NV&cyCode=USD

    作为信息,你从服务器得到什么样的错误?

    【讨论】:

    • 400 - 来自 curl 响应的错误请求
    • 只是标题..我今天肯定很累;)您是否尝试将 stateProvinceCode 更改为更“学术”?
    • 刚才我可以更改 stateProvinceCode 和 Currency 代码...但它不起作用请帮助我
    • 检查“$state” var 的填充方式,因为它似乎包含垃圾数据
    • @SomethingWrong 向我们展示 api 的工作 url 和修复后你的不工作(使用curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);),以便我们进行比较。 400 - 是一个错误的请求,这意味着您的 url 或标头中的某些内容是错误的。
    猜你喜欢
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多