【发布时间】:2014-02-17 23:19:42
【问题描述】:
我想使用 Google Maps API 对坐标/地址进行地理编码/反向地理编码。为此,我使用了 C# 的 webclient 类的一个实例。
static string gMapsUrl= "http://maps.googleapis.com/maps/api/geocode/xml?address= {0}&sensor=false";
public static List<Location> RetrieveCoordinate(string address)
{
string requestUri = string.Format(gMapsUrl, address);
string result = string.Empty;
using (var client = new WebClient())
{
client.Encoding = System.Text.Encoding.UTF8;
result = client.DownloadString(requestUri);
}
....
}
这通常有效,但是假设我想对地址“Götznerstraße”进行反向地理编码。如果我在浏览器中手动执行此操作,一切正常,请求的 URL 将是
http://maps.googleapis.com/maps/api/geocode/xml?address=götznerstraße&sensor=false
我的程序的最终请求看起来像这样
GET /maps/api/geocode/xml?address=G%C3%B6tznerstra%C3%9Fe&sensor=false HTTP/1.1
这会导致 Google 找不到匹配项。对我来说,似乎网络客户端在某处逃脱了变音符号,这使我无法获得结果。有没有办法阻止网络客户端这样做,或者让谷歌再次取消转义字符串?
编辑: 我解决了它,在比较浏览器和我的程序的请求后,我意识到我的浏览器正在发送一些额外的标头。更改后的实现如下所示
using (var client = new WebClient())
{
client.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
client.Headers.Add("Accept-Encoding", "gzip,deflate,sdch");
client.Headers.Add("Accept-Language", "de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4");
client.Encoding = System.Text.Encoding.UTF8;
result = client.DownloadString(requestUri);
}
非常感谢所有帮助过的人!
【问题讨论】:
-
可能浏览器只是自动将其翻译回给您以使其更具可读性。
-
如果您在您选择的浏览器中打开开发者模式(例如 Chrome 上的 Ctrl+shift+I),您会看到实际 HTTP GET 请求中的 URL 始终是百分比编码的。我会使用 Fiddler 并比较工作浏览器和您的应用程序的实际 HTTP 请求。
-
感谢 Uwe 和 Groo,我比较了这两个请求,发现我的程序发出的请求缺少一些标头!
标签: c# google-maps webclient diacritics