2011-05-17 22 views
6

Me gustaría utilizar el método de búsqueda de la API stackoverflow para devolver la estructura json de resultados basada en una palabra clave de búsqueda y luego mostrar esos resultados (título, descripción y la url) en el div SearchResults.stackoverflow search api

Soy nuevo en C# y mi primer intento fue algo como esto:

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

La cuestión es que lo que se devuelve se parece a dingbats basura - supongo que porque es serializado y necesitan ser deserializado?

+0

lo más probable es necesario cambiar la codificación de la cadena – Marcom

+1

Hay un error tipográfico en el nombre de la función: searchStockOverflow :) – badgerr

Respuesta

8

Definitivamente recomendaría usar el cliente REST; sin embargo, para ver los problemas ... generalmente quiere deserializar los datos como JSON manualmente, y luego ejecutar esos datos a través de su código de UI. Por ejemplo:

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

que utiliza el JavaScriptSerializer de System.Web.Extensions.dll

+0

+1 para la deserialización JSON y otras correcciones (cadena URL que se escapa, GET vs POST). Pero no creo que se necesite 'AutomaticDecompression', ya que no hay ningún campo 'Accept-Encoding' especificado en el encabezado HTTP (es decir, en' httpWebRequest'). – Groo

+0

@Groo - sí, pero si publico un ejemplo de SO API que no utiliza compresión, estoy bastante seguro de que mis colegas se reirán de mí (considerando dónde trabajo, etc.). Y agregar el soporte también agrega los encabezados de las solicitudes (revisé el violín) –

+0

¡Gracias a un millón de chicos, al final funcionó bien! También probé la biblioteca de Stacky, pero mi aplicación no hacía referencia a ella correctamente y me abrió otra lata de gusanos. – khuzbuzz

0

Lamentablemente estoy en mi Mac y no puedo ejecutar una prueba en su código. Es posible que desee comprobar la codificación de caracteres tanto de su página como de la secuencia de respuesta que regresa. Si no coinciden; podría causar que los caracteres provenientes de la secuencia de respuesta se procesen incorrectamente, de ahí la basura que está viendo.

+0

basado en esto: http://api.stackoverflow.com/1.1/usage/methods/search el objeto de retorno es una estructura json, una vez que tengo que puedo buscar la clave que necesito. – khuzbuzz