Як встановити HttpContent для другого параметра HttpClient PostAsync?


261
public static async Task<string> GetData(string url, string data)
{
    UriBuilder fullUri = new UriBuilder(url);

    if (!string.IsNullOrEmpty(data))
        fullUri.Query = data;

    HttpClient client = new HttpClient();

    HttpResponseMessage response = await client.PostAsync(new Uri(url), /*expects HttpContent*/);

    response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    response.EnsureSuccessStatusCode();
    string responseBody = await response.Content.ReadAsStringAsync();

    return responseBody;
}

PostAsyncМає ще один параметр , який повинен бути HttpContent.

Як налаштувати HttpContent? Ніде немає документації, яка працює для Windows Phone 8.

Якщо я це роблю GetAsync, це чудово працює! але це повинно бути POST із вмістом key = "bla", щось = "yay"

// РЕДАКТУВАТИ

Дякую за відповідь ... Це добре працює, але все ж є кілька невпевнених тут:

    public static async Task<string> GetData(string url, string data)
    {
        data = "test=something";

        HttpClient client = new HttpClient();
        StringContent queryString = new StringContent(data);

        HttpResponseMessage response = await client.PostAsync(new Uri(url), queryString );

        //response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
        response.EnsureSuccessStatusCode();
        string responseBody = await response.Content.ReadAsStringAsync();

        return responseBody;
    }

Дані "тест = щось", на що я припускав, підберуться на стороні api як "тестові дані" після публікації, очевидно, що це не так. З іншого боку, мені може знадобитися розміщувати цілі об’єкти / масиви через публікації даних, тому я припускаю, що json найкраще буде це зробити. Будь-які думки щодо того, як я отримую дані про публікацію?

Можливо, щось на кшталт:

class SomeSubData
{
    public string line1 { get; set; }
    public string line2 { get; set; }
}

class PostData
{
    public string test { get; set; }
    public SomeSubData lines { get; set; }
}

PostData data = new PostData { 
    test = "something",
    lines = new SomeSubData {
        line1 = "a line",
        line2 = "a second line"
    }
}
StringContent queryString = new StringContent(data); // But obviously that won't work

Можливий дублікат не вдається знайти HttpContent
Liam

Відповіді:


162

На це відповіді в деяких відповідях не вдається знайти HttpContent , а також у цій публікації в блозі .

Підсумовуючи це, ви не можете безпосередньо встановити екземпляр, HttpContentоскільки це абстрактний клас . Вам потрібно використовувати один клас, похідний від нього, залежно від ваших потреб. Швидше за все StringContent, що дозволяє встановити в конструкторі значення рядка відповіді, кодування та типу носія. Дивіться: http://msdn.microsoft.com/en-us/library/system.net.http.stringcontent.aspx


2
Я це перевірю. Я думаю, що коли я це знаходжу, мені доведеться поставити це десь там, де всі зможуть це побачити! Це вже протягом 4 днів я намагаюся отримати простий REST в API.
Jimmyt1988

StringContent чудово працював, але насправді не можу отримати PostData пройти на сайт, який я зараз телефоную: D. Я відредагую питання, щоб показати вам, що я зараз маю
Jimmyt1988

2
Швидка відповідь на тему "як я публікую репрезентацію мого класу JSON" - це "серіалізація об'єкта в JSON, можливо, з JSON.Net", але це справді належить до окремого питання.
Престон Гільо,

92

Щоб додати відповідь Престона, ось повний список HttpContentпохідних класів, доступних у стандартній бібліотеці:

Кредит: https://pfelix.wordpress.com/2012/01/16/the-new-system-net-http-classes-message-content/

Кредит : https://pfelix.wordpress.com/2012/01/16/the-new-system-net-http-classes-message-content/

Існує також припущення, ObjectContentале я не зміг його знайти ASP.NET Core.

Звичайно, ви можете пропустити все HttpContentце разом із Microsoft.AspNet.WebApi.Clientрозширеннями (вам доведеться зробити імпорт, щоб змусити його працювати в ASP.NET Core зараз: https://github.com/aspnet/Home/isissue/1558 ), і тоді ви можете робити такі речі, як:

var response = await client.PostAsJsonAsync("AddNewArticle", new Article
{
    Title = "New Article Title",
    Body = "New Article Body"
});

3
Найбільш вичерпна відповідь .. дуже акуратний і чистий спосіб досягти, мабуть, складного завдання.
сальман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.