Лучший способ вызвать JSON WebService из .NET Console

91

Я размещаю веб-службу в ASP.Net MVC3, которая возвращает строку Json. Каков наилучший способ вызвать веб-сервис из консольного приложения С # и проанализировать возврат в объект .NET?

Должен ли я ссылаться на MVC3 в моем консольном приложении?

В Json.Net есть несколько хороших методов для сериализации и десериализации .NET-объектов, но я не вижу, чтобы у него были способы POSTing и GETing значений из веб-сервиса.

Или мне просто нужно создать свой собственный вспомогательный метод для POSTing и GETing в веб-службу? Как мне сериализовать свой объект .net в пары ключ-значение?

BrokeMyLegВелосипед
источник

Ответы:

144

Я использую HttpWebRequest для GET из веб-службы, которая возвращает мне строку JSON. Для GET это выглядит примерно так:

// Returns JSON string
string GET(string url) 
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    try {
        WebResponse response = request.GetResponse();
        using (Stream responseStream = response.GetResponseStream()) {
            StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.UTF8);
            return reader.ReadToEnd();
        }
    }
    catch (WebException ex) {
        WebResponse errorResponse = ex.Response;
        using (Stream responseStream = errorResponse.GetResponseStream())
        {
            StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.GetEncoding("utf-8"));
            String errorText = reader.ReadToEnd();
            // log errorText
        }
        throw;
    }
}

Затем я использую JSON.Net для динамического анализа строки. В качестве альтернативы вы можете сгенерировать класс C # статически из образца выходных данных JSON с помощью этого инструмента codeplex: http://jsonclassgenerator.codeplex.com/

POST выглядит так:

// POST a JSON string
void POST(string url, string jsonContent) 
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";

    System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
    Byte[] byteArray = encoding.GetBytes(jsonContent);

    request.ContentLength = byteArray.Length;
    request.ContentType = @"application/json";

    using (Stream dataStream = request.GetRequestStream()) {
        dataStream.Write(byteArray, 0, byteArray.Length);
    }
    long length = 0;
    try {
        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) {
            length = response.ContentLength;
        }
    }
    catch (WebException ex) {
        // Log exception and throw as for GET example above
    }
}

Я использую такой код в автоматизированных тестах нашего веб-сервиса.

Гарет Оуэн
источник
JsonClassGenerator потрясающий. Десериализация проста, поскольку вы просто создаете строго типизированный объект, передавая строку json.
AaronLS
Если у вас есть символы в наборе, отличном от ascii, код, который у вас есть, необходимо немного изменить. ContentLength представляет количество байтов в опубликованном содержимом, поэтому технически request.ContentLength следует установить в byteArray.Length, а не jsonContent.Length.
Грейди Вернер
Encoding.GetEncoding("utf-8")можно заменить наEncoding.UTF8
JoelFan 02
Спасибо, это очень полезно
Светлана
Как часть авторизации будет установлен токен, но нам, возможно, также придется передать заголовки, если это потребуется для тестирования. Как этот request.Method = "GET"; request.Timeout = 20000; request.ContentType = "application / json"; request.Headers.Add ( "Авторизация", «Знаменосец ваш маркер:
Kurkula
51

WebClient для получения содержимого с удаленного URL- адреса и JavaScriptSerializer или Json.NET для десериализации JSON в объект .NET. Например, вы определяете класс модели, который будет отражать структуру JSON, а затем:

using (var client = new WebClient())
{
    var json = client.DownloadString("http://example.com/json");
    var serializer = new JavaScriptSerializer();
    SomeModel model = serializer.Deserialize<SomeModel>(json);
    // TODO: do something with the model
}

Есть также некоторые клиентские фреймворки REST, которые вы можете проверить, например RestSharp .

Дарин Димитров
источник
@BrokeMyLegBiking, какой? Это не имеет ничего общего с ASPAjax. Если вы говорите о классе JavaScriptSerializer, он встроен в .NET в сборке System.Web.Extensions, поэтому вам не нужно ничего загружать или устанавливать.
Дарин Димитров
Есть ли способ превратить все имена свойств / значения свойств объекта c # в пары ключ-значение POST (или пары ключ-значение GET)? чтобы я мог эффективно использовать объект C # в качестве входного значения для моего метода веб-службы?
BrokeMyLegBiking
@BrokeMyLegBiking, это будет зависеть от того, какой у вас объект и как веб-служба ожидает ввода.
Дарин Димитров
3
Мне очень понравилась библиотека RestSharp. Спасибо, что упомянули об этом.
Брайан Рэй,
1
Дарен, ты можешь обновить это, client.downloadstring () больше не работает.
JReam
9

Хотя существующие ответы являются действительными подходами, они устарели. HttpClient - это современный интерфейс для работы с веб-сервисами RESTful. Проверьте раздел примеров на странице по ссылке, там очень простой вариант использования асинхронного HTTP GET.

using (var client = new System.Net.Http.HttpClient())
{
    return await client.GetStringAsync("https://reqres.in/api/users/3"); //uri
}
LostNomad311
источник