Найкращий спосіб викликати веб-службу 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.