1

助けてくれる人にこんにちは..他に何をすべきかわかりません。xml 形式の応答を返す xml 要求を API に送信しようとしています。それを達成するためにcurlを使用しています。しかし、リクエストをどのようにフォーマットしても、常に 400 レスポンスが返されます。URL は正しくフォーマットされています。これが私のコードです:

$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

私は何を間違っていますか?どんな助けでも大歓迎です。

4

2 に答える 2

2

あなたが直面している問題は、カールとはあまり関係がありませんが、使用している 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>

URL が無効です。スペース文字などの特殊文字が含まれています。

適切にビルドする必要があります.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 CurlまたはBad Requestで概説されている情報を見つけることができます。ホストとシステムでもcurlを介してサイトに接続します

于 2013-04-08T10:42:12.647 に答える
0

連絡先の URL に XML コードが含まれていることに気付きます。

それがそこにあるはずだと確信していますか?

そうである場合は、適切に URL エンコードする必要があるかもしれません。コード 400 は、到達しようとしている URL が存在しないことを意味します。返された URL が送信された URL と一致しないため、これは true であることを示します。

于 2013-04-08T03:04:14.317 に答える