1

我正在为我的 Grails-Application 编写测试,我在我的应用程序中发现了一个“错误”——至少我认为它是我的应用程序。

我的请求如下所示:

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

并且响应包含我的州/省(我不知道确切的翻译 - 我来自德国,它分为 16 个较小的“州” - 称为“Bundesland”)

我的州被称为“巴登-符腾堡州”,这就是浏览器的响应。

在我的应用程序中,我使用 URL 和 BufferedReader(带有 InputStreamReader)来获取响应。

我试图断言,来自浏览器的响应等于我从代码中的 URL-Connection 获得的响应。

但是 - 问题/问题来了 - 它们不同。我发现的唯一区别是我所在州的名称。

如前所述,我从浏览器获得的响应包含“Baden-Württemberg”,但我通过代码获得的响应仅包含“Baden-Wurttemberg” - ü用常规u切换

这是我的代码:

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 我使用这个字符集,但它并没有解决这个错误。

我只是困惑为什么这是可能的。

我应该去哪里看?我没有那么有经验,所以我很无知

编辑:我进行了更多测试,如果我搜索包含变音符号的街道(“Bärenweg”或“Baerenweg”就是一个例子),两个响应(代码和浏览器)都包含正确的值:Bärenweg。似乎只有国家受此影响。

我应该立即联系谷歌吗?有了这个新测试,我不确定我是否能做点什么

4

2 回答 2

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 / 长话短说

在请求标头中设置语言属性,谷歌知道您希望响应使用什么语言。

于 2012-06-01T11:44:54.497 回答
0

URL 的查询字符串应该是 URL 编码的,因此ß被转换为转义序列。URLEncoder.encode("?...", "UTF-8").

于 2012-06-01T09:29:35.423 回答