【问题标题】:Stop webclient from escaping strings阻止 webclient 转义字符串
【发布时间】: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


【解决方案1】:

它必须转义 url。然而,没有什么能阻止你使用HttpUtility.UrlDecode 来取消它。 另请查看here 以获得更深入的答案。

【讨论】:

  • URL 编码规则和 HTML 编码规则并不完全相同。如果要解码 URL,请使用 UrlDecode,而不是 HtmlDecode
  • 你是对的。我的错,没有阅读我自己的答案就复制粘贴了:) Thx Damien。
【解决方案2】:

我认为问题实际上只是 Google 不太清楚如何处理 götznerstraße。

你的意思是 götzner straße 吗?

无论如何,G%C3%B6tznerstra%C3%9Fe 是“götznerstraße”的正确编码,并且编码不会导致您的问题。

【讨论】:

  • 您是否尝试在浏览器中输入 OP 的示例 url?因为unescaped version 在我的机器上工作正常。
  • 我做到了,实际上,它为我提供了“INVALID_REQUEST”。也许这是一个地理问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-07
  • 1970-01-01
  • 2016-10-26
相关资源
最近更新 更多