HttpClient PostAsync ikinci parametrem için HttpContent'i nasıl ayarlarım?


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

Alır olması PostAsyncgereken başka bir parametre alır HttpContent.

Nasıl kurarım HttpContent? Windows Phone 8 için çalışan hiçbir belge yoktur.

Eğer yaparsam GetAsync, harika çalışıyor! ancak key = "bla", bir şey = "yay" içeriğiyle POST olması gerekir

//DÜZENLE

Cevabınız için çok teşekkürler ... Bu iyi çalışıyor, ancak yine de burada birkaç emin değilim:

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

Ben varsayıyorum veri "test = bir şey" api tarafında sonrası veri "test" olarak almak olacağını, açıkça değil. Başka bir konuda, post veri yoluyla tüm nesneleri / dizileri göndermek gerekebilir, bu yüzden json bunu yapmak için en iyi olacağını varsayalım. Yayın verilerini nasıl aldığım konusunda herhangi bir fikriniz var mı?

Belki şöyle bir şey:

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

Yanıtlar:


162

Bu, HttpContent'in nasıl kullanılacağı ve bu blog gönderisinde bazı cevaplarda yanıtlanmaktadır .

Özetle, soyut bir sınıfHttpContent olduğu için doğrudan bir örneğini ayarlayamazsınız . İhtiyacınıza bağlı olarak onlardan türetilen sınıflardan birini kullanmanız gerekir. Büyük olasılıkla , yapıcıdaki yanıtın, kodlamanın ve ortam türünün dize değerini ayarlamanıza olanak tanır. Bkz. Http://msdn.microsoft.com/en-us/library/system.net.http.stringcontent.aspxStringContent


2
Bunu kontrol edeceğim. Sanırım bunu bulduğumda, bunu herkesin görebileceği bir yere koymam gerekecek! Bu, 4 gün boyunca beni bir API'ya basit bir REST almaya çalışarak gitti.
— Jimmyt1988

StringContent harika çalıştı, ama aslında, PostData şimdi aradığım siteye almak için alınamıyor: D. Size şu anda sahip olduğum şeyi göstermek için soruyu düzenleyeceğim
— Jimmyt1988

2
"Sınıfımın JSON yeniden sunumunu nasıl gönderirim?" Sorusuna hızlı bir cevap, "nesneyi JSON'a, muhtemelen JSON.Net'e serileştirmek" dir, ancak bu gerçekten ayrı bir soruya aittir.
— Preston Guillot

92

Preston'ın cevabına eklemek için HttpContent, standart kütüphanede bulunan türetilmiş sınıfların tam listesi :

Kredi bilgileri: https://pfelix.wordpress.com/2012/01/16/the-new-system-net-http-classes-message-content/

Kredi bilgileri : https://pfelix.wordpress.com/2012/01/16/the-new-system-net-http-classes-message-content/

Bir sözde var ObjectContentama onu bulamadım ASP.NET Core.

Tabii ki, her HttpContentşeyi Microsoft.AspNet.WebApi.Clientuzantılarla birlikte atlayabilirsiniz (şimdilik ASP.NET Core'da çalışması için bir ithalat yapmanız gerekir: https://github.com/aspnet/Home/issues/1558 ) ve sonra aşağıdakileri yapabilirsiniz:

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

3
En kapsamlı cevap .. görünüşte karmaşık bir görev elde etmek için çok temiz ve temiz bir yol.
— salman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.