Найкращий спосіб викликати веб-службу JSON із консолі .NET


89

Я розміщую веб-службу в ASP.Net MVC3, яка повертає рядок Json. Який найкращий спосіб викликати веб-службу із консольної програми ac # та проаналізувати повернення в .NET-об’єкт?

Чи слід посилатися на MVC3 у своєму консольному додатку?

Json.Net має кілька приємних методів для серіалізації та десеріалізації .NET-об'єктів, але я не бачу, що він має способи розміщення та отримання значень з веб-служби.

Або я повинен просто створити свій власний допоміжний метод для розміщення та отримання до веб-служби? Як я серіалізую свій .net-об'єкт на пари значень ключа?

Відповіді:


141

Я використовую HttpWebRequest для ОТРИМАННЯ веб-служби, яка повертає мені рядок 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 представляє кількість байтів у розміщеному вмісті, тому технічно вимагайте. ContentLength має бути встановлений як byteArray.Length, а не jsonContent.Length.
Грейді Вернер

Encoding.GetEncoding("utf-8")може бути замінений наEncoding.UTF8
JoelFan 02

Дякую, це дуже корисно
shweta

Як частина авторизації буде встановлено маркер, але, можливо, нам доведеться передавати заголовки, якщо це потрібно для тестування. Подобається цей запит.Method = "GET"; request.Timeout = 20000; request.ContentType = "application / json"; request.Headers.Add ("Авторизація", "Носій вашого жетону:
Куркула

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, тому вам не потрібно нічого завантажувати чи встановлювати.
Дарін Димитров

Чи є спосіб перетворити всі імена властивостей / значення властивостей об'єкта ac # на пари ключ-значення POST (або пари GET ключ-значення)? щоб я міг ефективно використовувати об'єкт c # як вхідне значення для мого методу веб-сервісу?
BrokeMyLegBiking

@BrokeMyLegBiking, це буде залежати від того, який об’єкт у вас є, і як веб-служба очікує на введення.
Дарін Димитров

3
Мені дуже сподобалася бібліотека RestSharp. Дякую, що згадали про це.
Bryan Ray

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
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.