2014-01-27 1 views
1

Я хочу использовать API Карт Google для геокодирования/обратного геокодирования координат/адресов. Для этого я использую экземпляр класса Webclient C#.Остановить веб-клиент от экранирующих строк

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 найти не Матчи. Мне кажется, что веб-клиент где-то избегает умлаут, что мешает мне получать результаты. Есть ли способ остановить веб-клиента от этого или заставить Google снова игнорировать строку?

EDIT: Я решил, что после сравнения запроса с браузером и моей программой я понял, что мой браузер отправляет некоторые дополнительные заголовки. Измененная реализация выглядит так:

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); 
} 

Большое спасибо всем, кто помог!

+0

Возможно, браузер просто автоматически переводит его обратно, чтобы сделать его более читаемым. –

+0

Если вы открываете режим разработчика в своем браузере по выбору (например, Ctrl + shift + I в Chrome), вы увидите, что URL-адрес в фактическом запросе HTTP GET всегда кодируется в процентах. Я бы использовал [Fiddler] (http://www.telerik.com/fiddler) и сравнивал фактические HTTP-запросы рабочего браузера и вашего приложения. – Groo

+0

Спасибо вам обоим Уве и Гроо, я сравнил эти два запроса и увидел, что в запросе моей программы отсутствовали некоторые заголовки! – user3239482

ответ

1

Он должен скрыться от URL-адреса. Однако нет ничего, что помешало бы вам использовать HttpUtility.UrlDecode, чтобы отменить его. Также посмотрите here для более глубокого ответа.

+2

Правила кодирования URL-адресов и правила кодирования HTML не совсем то же самое. Если вы хотите декодировать URL-адрес, используйте 'UrlDecode', а не' HtmlDecode'. –

+0

Вы правы. Мой плохой, копируемый, не читая моего собственного ответа :) Thx Damien. – Alex

0

Я думаю, проблема в том, что Google не совсем знает, что делать с götznerstraße.

Google doesn't know götznerstraße

вы на самом деле означает götzner Straße?

Независимо от того, G%C3%B6tznerstra%C3%9Fe является правильной кодировкой «götznerstraße», и кодировка не вызывает проблемы.

+0

Вы пытались ввести URL-адрес примера OP в браузере? Поскольку [unescaped version] (http://maps.googleapis.com/maps/api/geocode/xml?address=götznerstraße&sensor=false) работает нормально на моей машине. – Groo

+0

Я действительно, это дает мне «INVALID_REQUEST». Возможно, это географическая проблема. – Mitch