Bagaimana cara mengatur HttpContent untuk parameter kedua HttpClient PostAsync saya?

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

The PostAsyncmengambil parameter lain bahwa kebutuhan untuk menjadi HttpContent.

Bagaimana cara mengatur HttpContent? Tidak ada dokumentasi di mana pun yang berfungsi untuk Windows Phone 8.

Jika saya melakukannya GetAsync, itu akan berhasil! tetapi perlu POST dengan konten key = "bla", something = "yay"

// EDIT

Terima kasih banyak atas jawabannya ... Ini bekerja dengan baik, tetapi masih sedikit yang tidak yakin di sini:

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

Data "test = something" Saya berasumsi akan mengambil sisi api sebagai data post "test", ternyata tidak. Pada masalah lain, saya mungkin perlu memposting seluruh objek / array melalui data posting, jadi saya menganggap json akan lebih baik untuk melakukannya. Adakah pemikiran tentang bagaimana saya mendapatkan data posting?

Mungkin sesuatu seperti:

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
sumber

Jawaban:

162

Ini dijawab dalam beberapa jawaban untuk Tidak dapat menemukan cara menggunakan HttpContent serta dalam posting blog ini .

Singkatnya, Anda tidak dapat langsung membuat instance HttpContentkarena ini adalah kelas abstrak . Anda perlu menggunakan salah satu kelas yang berasal dari itu tergantung pada kebutuhan Anda. Kemungkinan besar StringContent, yang memungkinkan Anda mengatur nilai string dari respons, pengodean, dan jenis media dalam konstruktor. Lihat: http://msdn.microsoft.com/en-us/library/system.net.http.stringcontent.aspx

Preston Guillot
sumber
2
Saya akan memeriksanya. Saya pikir ketika saya menemukan ini, saya harus meletakkan ini di suatu tempat di mana semua orang bisa melihatnya! Ini membuat saya pergi selama 4 hari sekarang, mencoba mendapatkan REST sederhana ke API.
Jimmyt1988
StringContent bekerja dengan sangat baik, tetapi sebenarnya, tidak bisa mendapatkan PostData untuk sampai ke situs yang saya panggil sekarang: D. Saya akan mengedit pertanyaan untuk menunjukkan kepada Anda apa yang sekarang saya miliki
Jimmyt1988
2
Sebuah jawaban cepat untuk "bagaimana saya memposting reprsentasi JSON dari kelas saya" adalah "membuat serialisasi objek ke JSON, mungkin dengan JSON.Net", tetapi itu benar-benar termasuk dalam pertanyaan terpisah.
Preston Guillot
92

Untuk menambah jawaban Preston, berikut adalah daftar lengkap dari HttpContentkelas turunan yang tersedia di perpustakaan standar:

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

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

Ada juga yang seharusnya ObjectContenttetapi saya tidak dapat menemukannya ASP.NET Core.

Tentu saja, Anda dapat melewati HttpContentsemuanya dengan Microsoft.AspNet.WebApi.Clientekstensi (Anda harus melakukan impor untuk membuatnya berfungsi di ASP.NET Core untuk saat ini: https://github.com/aspnet/Home/issues/1558 ) dan kemudian Anda dapat melakukan hal-hal seperti:

var response = await client.PostAsJsonAsync("AddNewArticle", new Article
{
    Title = "New Article Title",
    Body = "New Article Body"
});
Serj Sagan
sumber
3
Jawaban paling komprehensif .. cara yang sangat rapi dan bersih untuk mencapai tugas yang tampaknya rumit.
salman