2014-01-27 70 views
1

我想使用Google Maps API來轉換地理編碼/反向地理編碼座標/地址。爲此,我使用C#的webclient類的一個實例。從轉義字符串中停止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 

這導致谷歌發現沒有火柴。對我來說,看起來好像webclient在某個地方逃跑了,這阻止了我獲得結果。有沒有辦法阻止Web客戶端這樣做,或讓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); 
} 

非常感謝所有幫助過的人!

+0

可能瀏覽器只是自動將它翻譯回給你,使其更具可讀性。 –

+0

如果您在選擇的瀏覽器中打開開發人員模式(例如,Chrome上的Ctrl + shift + I),則會看到實際HTTP GET請求中的URL始終是百分比編碼的。我會使用[Fiddler](http://www.telerik.com/fiddler)並比較工作瀏覽器和您的應用程序的實際HTTP請求。 – Groo

+0

感謝你們Uwe和Groo,我比較了這兩個請求,並看到我的程序所做的請求丟失了一些頭文件! – user3239482

回答

1

它必須逃避網址。然而,沒有什麼能阻止你使用HttpUtility.UrlDecode來嘲笑它。 也看看here更深入的答案。

+2

URL編碼規則和HTML編碼規則不完全相同。如果你想解碼一個URL,使用'UrlDecode',而不是'HtmlDecode'。 –

+0

你說得對。我的壞,沒有閱讀我自己的答案copypasted :) Thx Damien。 – Alex

0

我認爲問題其實只是Google不知道如何處理götznerstraße。

Google doesn't know götznerstraße

你實際上意味着götzner大街?

無論如何,G%C3%B6tznerstra%C3%9Fe是「götznerstraße」的正確編碼,並且編碼不會導致您的問題。

+0

您是否嘗試在瀏覽器中輸入OP的示例url?因爲[unescaped版本](http://maps.googleapis.com/maps/api/geocode/xml?address=götznerstraße&sensor=false)在我的計算機上正常工作。 – Groo

+0

我做到了,實際上,它爲我提供了「INVALID_REQUEST」。也許這是一個地理問題。 – Mitch