2011-05-17 70 views
6

我想使用stackoverflow API的搜索方法,根據搜索關鍵字返回結果的json結構,然後在SearchResults div中顯示這些結果(標題,描述和url)。stackoverflow search api

我是新來的C#和我第一次嘗試去是這樣的:

protected void searchStockOverflow(string y) 
    { 

     var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://api.stackoverflow.com/1.1/search?intitle="+y); 
     httpWebRequest.ContentType = "text/json"; 
     httpWebRequest.Method = "POST"; 

     using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) 
     { 
      string json = "{ \"intitle\": \"" + y + "\"}"; 

      streamWriter.Write(json); 
     } 
     var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 
     using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) 
     { 
      var responseText = streamReader.ReadToEnd(); 

      SearchResults.InnerHtml += "<div style='border:1px solid blue;margin:5px;'>"; 
      SearchResults.InnerHtml += responseText + "<br />"; 
      SearchResults.InnerHtml += "</div><br style='clear:both;' />"; 
     } 
    } 

問題是返回看起來像裝飾符號垃圾 - 我猜是因爲它是序列化,需要進行反序列化?

+0

最有可能需要更改該字符串 – Marcom 2011-05-17 12:58:00

+1

的編碼。在你的函數名一個錯字:searchStockOverflow :) – badgerr 2011-05-17 13:02:21

回答

8

我肯定會說考慮使用REST客戶端;然而,看看這些問題...通常您想要手動將數據反序列化爲JSON,然後然後通過您的UI代碼運行該數據。例如:

static void SearchStackOverflow(string y) 
{ 
    var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://api.stackoverflow.com/1.1/search?intitle=" + Uri.EscapeDataString(y)); 
    httpWebRequest.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; 
    httpWebRequest.Method = "GET"; 
    var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 
    string responseText; 
    using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) 
    { 
     responseText = streamReader.ReadToEnd(); 
    } 
    var result = (SearchResult)new JavaScriptSerializer().Deserialize(responseText, typeof(SearchResult)); 
    .... do something with result ... 
} 
class SearchResult 
{ 
    public List<Question> questions { get; set; } 
} 
class Question 
{ 
    public string title { get; set; } 
    public int answer_count { get; set; } 
} 

從System.Web.Extensions.dll

使用JavaScriptSerializer
+0

對於JSON反序列化和其他修正(URL字符串轉義,GET與POST)+1。但我不認爲需要'AutomaticDecompression',因爲在HTTP頭(即在'httpWebRequest')中沒有指定'Accept-Encoding'字段。 – Groo 2011-05-17 13:18:17

+0

@格羅 - 是的,但是如果我發佈一個不使用壓縮的SO API示例,我很確定我的同事會笑我(考慮我在哪裏工作等)。並添加支持也添加了請求標題(我檢查了小提琴手) – 2011-05-17 13:22:46

+0

感謝百萬傢伙,這最終運作良好!另外嘗試Stacky庫,但我的應用程序沒有正確引用它,並打開了另一罐蠕蟲。 – khuzbuzz 2011-05-18 13:48:05

0

不幸的是,我在我的Mac上,無法對您的代碼運行測試。您可能想要檢查頁面和返回的響應流的字符編碼。如果它們不匹配;它可能會導致來自響應流的字符被錯誤地渲染,因此您看到垃圾。

+0

基於此:http://api.stackoverflow.com/1.1/usage/methods/search返回對象是一個JSON結構,一旦我有,我可以搜索我需要的密鑰。 – khuzbuzz 2011-05-17 13:00:16