Jak skonfigurować HttpContent dla mojego drugiego parametru 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;
}

PostAsyncTrwa kolejny parametr, który musi być HttpContent.

Jak skonfigurować HttpContent? Nigdzie nie ma dokumentacji, która działałaby na Windows Phone 8.

Jeśli tak GetAsync, to działa świetnie! ale musi to być test POST z zawartością key = "bla", coś = "yay"

//EDYTOWAĆ

Dziękuję bardzo za odpowiedź ... To działa dobrze, ale wciąż kilka nie zapewnia:

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

Zakładam, że dane „test = coś” przyjęłyby się po stronie interfejsu API jako „test” danych postu, najwyraźniej nie. W innej sprawie może być konieczne opublikowanie całych obiektów / tablic za pośrednictwem danych przesyłania, więc zakładam, że najlepiej będzie to zrobić w json. Czy są jakieś przemyślenia na temat tego, w jaki sposób mogę uzyskać przesyłanie danych?

Być może coś takiego:

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
Jimmyt1988
źródło

Odpowiedzi:

162

Odpowiedzi na to znajdują się w niektórych odpowiedziach na Nie można znaleźć sposobu korzystania z HttpContent, a także w tym poście na blogu .

Podsumowując, nie można bezpośrednio skonfigurować wystąpienia, HttpContentponieważ jest to klasa abstrakcyjna . Musisz użyć jednej z pochodnych klas, w zależności od potrzeb. Najprawdopodobniej StringContentpozwala to ustawić wartość ciągu odpowiedzi, kodowania i typu nośnika w konstruktorze. Zobacz: http://msdn.microsoft.com/en-us/library/system.net.http.stringcontent.aspx

Preston Guillot
źródło
2
Sprawdzę to. Myślę, że kiedy się tego dowiem, będę musiał umieścić to w miejscu, w którym każdy może to zobaczyć! To działało już od 4 dni, próbując uzyskać prosty REST dla API.
Jimmyt1988,
StringContent działał świetnie, ale tak naprawdę nie można uzyskać dostępu do PostData do strony, do której dzwonię: D.
Przeredaguję
2
Szybka odpowiedź na pytanie „jak wysłać JSON-ową reprezentację mojej klasy” to „serializować obiekt do JSON, prawdopodobnie za pomocą JSON.Net”, ale tak naprawdę należy to do osobnego pytania.
Preston Guillot
92

Aby dodać do odpowiedzi Prestona, oto pełna lista HttpContentklas pochodnych dostępnych w bibliotece standardowej:

Źródło: https://pfelix.wordpress.com/2012/01/16/the-new-system-net-http-classes-message-content/

Źródło : https://pfelix.wordpress.com/2012/01/16/the-new-system-net-http-classes-message-content/

Jest też domniemany, ObjectContentale nie mogłem go znaleźć ASP.NET Core.

Oczywiście możesz pominąć całość HttpContentwraz z Microsoft.AspNet.WebApi.Clientrozszerzeniami (musisz teraz zaimportować, aby na razie działała w ASP.NET Core: https://github.com/aspnet/Home/issues/1558 ), a następnie możesz robić takie rzeczy jak:

var response = await client.PostAsJsonAsync("AddNewArticle", new Article
{
    Title = "New Article Title",
    Body = "New Article Body"
});
Serj Sagan
źródło
3
Najbardziej wyczerpująca odpowiedź .. bardzo schludny i czysty sposób na osiągnięcie pozornie skomplikowanego zadania.
salman,