Saya memiliki tipe kompleks khusus yang ingin saya kerjakan menggunakan API Web.
public class Widget
{
public int ID { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
Dan inilah metode pengontrol API web saya. Saya ingin memposting objek ini seperti ini:
public class TestController : ApiController
{
// POST /api/test
public HttpResponseMessage<Widget> Post(Widget widget)
{
widget.ID = 1; // hardcoded for now. TODO: Save to db and return newly created ID
var response = new HttpResponseMessage<Widget>(widget, HttpStatusCode.Created);
response.Headers.Location = new Uri(Request.RequestUri, "/api/test/" + widget.ID.ToString());
return response;
}
}
Dan sekarang saya ingin menggunakan System.Net.HttpClient
untuk memanggil metode tersebut. Namun, saya tidak yakin jenis objek apa yang akan diteruskan ke dalam PostAsync
metode, dan bagaimana membangunnya. Berikut beberapa contoh kode klien.
var client = new HttpClient();
HttpContent content = new StringContent("???"); // how do I construct the Widget to post?
client.PostAsync("http://localhost:44268/api/test", content).ContinueWith(
(postTask) =>
{
postTask.Result.EnsureSuccessStatusCode();
});
Bagaimana cara membuat HttpContent
objek sedemikian rupa sehingga web API akan memahaminya?
c#
asp.net-web-api
indot_brad
sumber
sumber
Jawaban:
Generik
HttpRequestMessage<T>
telah dihapus . Ini:tidak akan bekerja lagi .
Sebaliknya, dari posting ini , tim ASP.NET telah menyertakan beberapa panggilan baru untuk mendukung fungsionalitas ini:
Jadi, kode baru ( dari dunston ) menjadi:
sumber
HttpClient.PostAsXXXAsync<T>( T value ) methods are great, but what about one for application/x-www-form-urlencoded format? Is there a simple / short way for that or do we still need to create elaborate
KeyValuePair` baru ?PostUrlEncodedAsync
.PostAsJsonAsync
atauPostAsXmlAsync
Anda harus menggunakan
SendAsync
metode ini, ini adalah metode umum, yang membuat serial input ke layananJika Anda tidak ingin membuat kelas beton, Anda dapat membuatnya dengan
FormUrlEncodedContent
kelas tersebutCatatan: Anda perlu membuat id Anda menjadi nullable int (
int?
)sumber
Perhatikan bahwa jika Anda menggunakan Pustaka Kelas Portabel, HttpClient tidak akan memiliki metode PostAsJsonAsync . Untuk memposting konten sebagai JSON menggunakan Perpustakaan Kelas Portabel, Anda harus melakukan ini:
sumber
Jika Anda menginginkan jenis metode kenyamanan yang disebutkan dalam jawaban lain tetapi memerlukan portabilitas (atau bahkan jika tidak), Anda mungkin ingin memeriksa Flurl [pengungkapan: Saya penulis]. Ini (tipis) membungkus
HttpClient
dan Json.NET dan menambahkan beberapa gula yang lancar dan barang lainnya, termasuk beberapa pembantu pengujian yang dipanggang .Posting sebagai JSON:
atau URL-encoded:
Kedua contoh di atas mengembalikan
HttpResponseMessage
, tetapi Flurl menyertakan metode ekstensi untuk mengembalikan hal-hal lain jika Anda hanya ingin langsung saja:Flurl tersedia di NuGet:
sumber
Setelah menyelidiki banyak alternatif, saya menemukan pendekatan lain, cocok untuk versi API 2.0.
(VB.NET adalah favorit saya, sooo ...)
Semoga berhasil! Bagi saya ini berhasil (pada akhirnya!).
Salam, Peter
sumber
Saya pikir Anda bisa melakukan ini:
sumber
Jika seseorang seperti saya tidak benar-benar mengerti apa yang dibicarakan semua di atas, saya memberikan contoh mudah yang berhasil untuk saya. Jika Anda memiliki api web dengan url " http://somesite.com/verifyAddress ", itu adalah metode posting dan Anda perlu mengirimkannya ke objek alamat. Anda ingin memanggil api ini dalam kode Anda. Di sini yang dapat Anda lakukan.
sumber
Ini adalah kode yang saya akhiri, berdasarkan jawaban lain di sini. Ini untuk HttpPost yang menerima dan merespons dengan tipe kompleks:
sumber
Lakukan panggilan layanan seperti ini:
Dan metode Layanan seperti ini:
PutAsJsonAsync menangani Serialisasi dan deserialisasi melalui jaringan
sumber
PostAsJsonAsync
akan mengirim data yang dibutuhkan, sebagai POST di JSON.