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.