2012-05-31 98 views
1

我正在爲我的Grails應用編寫測試,並且在我的應用程序中發現了一個「錯誤」 - 至少我認爲它是我的應用程序。來自Google地理編碼的不同編碼/響應-API

我的要求是這樣的:

http://maps.googleapis.com/maps/api/geocode/json?address=Karlsruhe+76131+Tullastraße+17&sensor=false 

和響應包含我的州/省(我不知道確切的翻譯 - 我來自德國和它分成16個較小的「國家」 - 叫做「Bundesland」)

我的狀態被稱爲「Baden-Württemberg」,在瀏覽器的響應中就是這樣。

在我的應用程序中,我使用URL和BufferedReader(帶有InputStreamReader)來獲取響應。

我試圖斷言,來自瀏覽器的響應等於我從我的代碼中的URL連接得到的響應。

但是 - 問題出在這裏 - 它們有所不同。我發現的唯一區別在於我的國家的名字。

當我從瀏覽器得到的迴應之前提到的含有「巴登 - 符騰堡州」,但我通過我的代碼得到的迴應只包含「巴登 - 符騰堡」 - 在ü切換與常規ü

這裏是我的代碼:

URLConnection connection = new URL(url).openConnection() 

BufferedReader br = new BufferedReader(new InputStreamReader(connection.content, "UTF-8")) 
StringBuffer connectionResponse = new StringBuffer() 

while (br.ready()) { 
    connectionResponse.append(br.readLine()) 
} 
br.close() 
return connectionResponse.toString() 

我的搜索導致我傳遞一個字符集的InputStreamReader中的選項 - 因爲我希望它是UTF-8我用這個字符集,但它不解決這個bug。

我只是困惑,爲什麼這是可能的。

我應該在哪裏看?我沒那麼有經驗,所以我很無知

編輯︰ 我測試了一些,如果我搜索與包含元音變音的街道(「Bärenweg」或「Baerenweg」將是一個例子),兩個迴應(代碼和瀏覽器)包含正確的值:Bärenweg。似乎只有國家受此影響。

我應該馬上聯繫Google嗎?通過這個新測試,我不確定我是否可以做些什麼

回答

4

問題解決了。 我問了我的一位同事,他建議,唯一合理的原因可能是不同的請求頭。

我能想到的唯一方法就是用wireshark。所以我下載並安裝了它(WinPCab與它一起安裝)並在安裝後啓動它。

首先,我觸發了在Firefox中按F5和Grails的

運行我的測試都要求然後,我添加了過濾器「http.response」(意爲從HTTP請求的所有響應應該是可見的)。 Response-Headers幾乎相同,並沒有發生任何明顯的錯誤。

然後我篩選了「http.request」來比較發送給google-api的頭文件,然後在響應中關閉了一些。

首先我比較了Accept-Property,並將我的代碼中的屬性設置爲Browser-Response(可以正常工作)的值。 沒有解決問題。

所以下一個屬性:Accept-Language。

在代碼的Request-header中,這個屬性根本就不存在,所以我從Browser-Request-header和kazaam複製它:它工作正常!

Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3 

設置連接上這個屬性添加以下代碼:

connection.setRequestProperty("Accept-Language", "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3"); 

TL; DR /長話短說

設置在請求報頭中的語言屬性與谷歌知道你期望得到的迴應是什麼語言。

0

該URL的查詢字符串應該是URL編碼的,因此ß將轉換爲轉義序列。 URLEncoder.encode("?...", "UTF-8")

+0

在google api的情況下並不重要,因爲它總是返回正確的值。不過,我修復了它 - 看看我的回覆 – Zobbl

+0

Upvote的解決方案過程。 –