2011-05-17 3 views
6

Je voudrais utiliser la méthode de recherche de stackoverflow API pour retourner la structure json des résultats basés sur un mot-clé de recherche et ensuite afficher ces résultats (titre, description et l'URL) dans la div SearchResults.stackoverflow recherche API

Je suis nouveau à C# et ma première tentative quelque chose comme ceci:

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;' />"; 
     } 
    } 

Le problème est que ce qui est retourné ressemble à ordures Dingbats - je suppose parce qu'il est sérialisé et doivent être désérialisé?

+0

plus probablement vous devez modifier le codage de la chaîne – Marcom

+1

Il y a une faute de frappe dans le nom de votre fonction: searchStockOverflow :) – badgerr

Répondre

8

Je dirais certainement envisager d'utiliser le client REST; cependant, pour regarder les problèmes ... généralement vous voulez désérialiser les données comme JSON manuellement, puis exécuter ces données via votre code d'interface utilisateur. Par exemple:

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

qui utilise les JavaScriptSerializer de System.Web.Extensions.dll

+0

+1 pour désérialisation JSON et autres correctifs (chaîne d'URL qui s'échappe, GET vs POST). Mais je ne pense pas que 'AutomaticDecompression' soit nécessaire, car il n'y a pas de champ' Accept-Encoding' spécifié dans l'en-tête HTTP (c'est-à-dire dans 'httpWebRequest'). – Groo

+0

@Groo - oui, mais si je poste un exemple d'API SO n'utilisant pas la compression, je suis à peu près certain que mes collègues se moqueront de moi (en considérant où je travaille, etc.). Et en ajoutant le support ajoute également les en-têtes de la demande (j'ai vérifié dans le violoneur) –

+0

Merci un million de gars, cela a bien fonctionné à la fin! J'ai aussi essayé la bibliothèque Stacky mais mon application ne la référençait pas correctement et a ouvert une autre boîte de Pandore. – khuzbuzz

0

Malheureusement, je suis sur mon Mac et je ne peux pas tester votre code. Vous voudrez peut-être vérifier l'encodage des caractères de votre page et du flux de réponse qui revient. Si elles ne correspondent pas; Les caractères provenant du flux de réponse peuvent être rendus de manière incorrecte, d'où les déchets que vous voyez.

+0

basé sur ceci: http://api.stackoverflow.com/1.1/usage/methods/search l'objet de retour est une structure json, une fois que j'ai ce que je peux rechercher la clé dont j'ai besoin. – khuzbuzz