2012-05-31 76 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的解决方案过程。 –