2013-04-08 38 views
0

對任何願意幫助的人致以問候..我不知道還有什麼要做。我試圖發送一個XML請求到一個API將返回一個XML格式的響應。我正在使用curl來實現它。但無論我如何格式化我的請求,我總是得到400響應。網址格式正確。這裏是我的代碼: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'); 

這裏是我找回從捲曲的信息:

[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 

我在做什麼錯?任何幫助,將不勝感激。

+0

我不是熟悉curl,但從我的身體使用命令'curl -O http:// url_to_your_api_call'應該工作,這將得到xml,然後您可以選擇處理,然而您選擇 – brendosthoughts 2013-04-08 02:19:01

+0

感謝您的答覆,但我不明白我應該在哪裏提出。你能否從我的代碼中更好地理解?謝謝 – lov2code 2013-04-08 02:31:05

+0

我可以嘗試幫助,首先您已嘗試在poi.xml中查看腳本從哪個工作目錄中調用?從什麼捲曲告訴你一個400性反應的是HTTP代碼意味着你有一個壞請求(非正常格式化)這個格式化是特定於您的API(這是我沒有的知識) – brendosthoughts 2013-04-08 02:49:01

回答

0

無法理解您正在聯繫的URL中的XML代碼。

你確定應該在那裏嗎?

如果是這樣,您可能需要對其進行正確的URL編碼。代碼400意味着您嘗試訪問的URL不存在。由於返回的網址與您發送的網址不匹配,這會指向真實。

2

你所面臨的問題有少做捲曲,但更與正在使用的網址:

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的問題。請求仍然可能有更多問題/其他錯誤。當你正在使用捲曲,你可能會發現在Php - Debugging CurlBad Request. Connecting to sites via curl on host and system列出的信息,以及。