API поиска стека - PullRequest
       4

API поиска стека

6 голосов
/ 17 мая 2011

Я хотел бы использовать метод поиска API-интерфейса stackoverflow, чтобы вернуть структуру результатов json на основе ключевого слова поиска, а затем отобразить эти результаты (заголовок, описание и URL-адрес) в элементе SearchResults.

Я новичок в 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;' />";
        }
    }

Проблема в том, что возвращаемое выглядит как мусор дингбатов - я думаю, потому что он сериализован и его нужно десериализовать?

Ответы [ 3 ]

8 голосов
/ 17 мая 2011

Я бы определенно сказал, рассмотрите возможность использования клиента REST;однако, чтобы посмотреть на проблемы ... обычно вы хотите десериализовать данные как JSON вручную, затем пропустите эти данные через ваш код пользовательского интерфейса.Например:

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

, который использует JavaScriptSerializer из System.Web.Extensions.dll

3 голосов
/ 17 мая 2011

Также взгляните на Stacky StackApps .Net Client Library , который представляет собой основанный на REST API и обеспечивающий доступ к семейству стековых потоков.

0 голосов
/ 17 мая 2011

К сожалению, я на своем Mac и не могу выполнить тест вашего кода. Возможно, вы захотите проверить кодировку символов вашей страницы и ответного потока, возвращающегося. Если они не совпадают; это может привести к тому, что символы, поступающие из потока ответов, будут отображаться неправильно, отсюда и мусор, который вы видите.

...