2017-02-01 202 views
-2

我是新來的API的東西。 我想在c#代碼中得到這個api(http://services.groupkt.com/country/get/all)的結果。你能幫助我通過建議任何代碼和教程以及。謝謝 我已經試過這段代碼,但它不工作。在客戶端調用rest api c#

public async Task DownloadData() 
{ 
    string url = string.Format("http://services.groupkt.com/country/get/all"); 

    HttpClient client = new HttpClient(); 
    client.DefaultRequestHeaders.Add("Accept", "application/json"); 

    var jsonString = await client.GetStringAsync(url); 

    JToken token = JToken.Parse(jsonString); 

    foreach (var item in token) 
    { 
     txtarea.Value= item.ToString(); 
    } 
} 
+1

「是亙古不變的作品」有好幾個意思。你是否得到任何編譯器錯誤,運行時錯誤,或者你沒有得到預期的結果? – Thangadurai

+0

我試圖在textarea中顯示結果,但它沒有顯示任何結果。 –

+0

使用瀏覽器訪問該網址,看看你正在收到什麼?或者你也可以使用fiddler來測試服務url。 – Thangadurai

回答

1

首先使用

client.GetStringAsync(url).Result 

,而不是

client.GetStringAsync(url) 

第二你收到的JSON之後,就變得非常簡單的解析結果。我看到以前的答案,他們都在使用循環,這在我看來不是一個好主意來解析。 使用Newtonsoft.Json庫和它在這種情況下非常方便。我已經使用這個庫分析了你的json響應。 使一類的結果,即

public class result 
    { 
     public string name { get; set; } 
     public string alpha3_code { get; set; } 
     public string alpha2_code { get; set; } 
    } 

看跌越來越解析您的JSON JSON響應此代碼後。

JObject jsonResponse = JObject.Parse(jsonString); 
JObject objResponse = (JObject)jsonResponse["RestResponse"]; 
Dictionary<string, JArray> _Data = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, JArray>>(objResponse.ToString()); 
var results = _Data["result"].ToObject<List<result>>(); 

它的工作完美,我測試了這一點。

不要忘記添加Newtonsoft.Json和Newtonsoft.Json.Linq命名空間

0

您的代碼正確地獲取響應。但解析不正確。

請嘗試下面的完整解析代碼。

public async Task DownloadData() 
{ 
    string url = string.Format("http://services.groupkt.com/country/get/all"); 
    string top_parent_key_name = "RestResponse"; 
    string second_parent_key_name = "result"; 
    string field_one_key_name = "name"; 

    HttpClient client = new HttpClient(); 
    client.DefaultRequestHeaders.Add("Accept", "application/json"); 

    var jsonString = await client.GetStringAsync(url); 

    JToken token = JToken.Parse(jsonString); 

    foreach (var item in token[top_parent_key_name][second_parent_key_name]) 
    { 
     txtarea.InnerText = item[field_one_key_name].ToString(); 
    } 
} 
+0

用這個替換你的前端控制名稱。例如txtarea.Value = item [field_one_key_name] .ToString(); –

+0

我打電話等待DownloadData();在按鈕點擊功能和顯示結果的標籤,但它沒有顯示任何東西 –

+0

試試這個'txtarea.InnerText = item [field_one_key_name] .ToString();' –

0

只是爲了補充一點,我寧願選擇動態,所以代碼更清晰。

public async Task DownloadData() 
{ 
    string url = $"http://services.groupkt.com/country/get/all"; 

    HttpClient client = new HttpClient(); 
    client.DefaultRequestHeaders.Add("Accept", "application/json"); 

    string response = await client.GetStringAsync(url); 

    dynamic json = JToken.Parse(response); 

    foreach (var item in token.RestResponse.result) 
    { 
     //Note: Your over writing the text here for each item you pass 
     //  Did you mean to concat instead? += "\n\r" + item.name; 
     txtarea.InnerText = item.ToString(); 
    } 
} 

現在爲只是做txtarea.InnerText = ...在你與「ASP.NET的Web-API」標記問題似乎有點奇怪,它是一個ASP.NET MVC使用Web API或更經典的Web窗體應用程序?