Posting badan kosong ke REST API melalui HttpClient


119

API yang saya coba panggil mengharuskan saya melakukan POST tetapi dengan badan kosong. Saya baru menggunakan WCF Web API HttpClient dan saya tidak bisa menemukan kode tulis yang akan melakukan posting dengan badan kosong. Saya menemukan referensi ke beberapa metode HttpContent.CreateEmpty (), tapi saya rasa itu bukan untuk kode HttpClient API Web karena saya tidak bisa menemukan metode itu.


HttpContent.CreateEmpty berasal dari prototipe HttpClient lama yang merupakan bagian dari REST Starter kit. Sayangnya tidak ada padanan di HttpClient baru.
Darrel Miller


1
@MichaelFidgeim Jika ada lubang dalam kontinum ruang waktu dan entah bagaimana 2013 datang sebelum 2011, maka ya itu kemungkinan duplikat.
Ryan Rinaldi

1
"Kemungkinan duplikat" adalah cara untuk membersihkan - menutup pertanyaan serupa dan menyimpan pertanyaan dengan jawaban terbaik. Tanggal tidak penting. Lihat meta.stackexchange.com/questions/147643/… Jika Anda setuju bahwa ini memerlukan klarifikasi, silakan pilih di meta.stackexchange.com/questions/281980/…
Michael Freidgeim

Jawaban:


118

Gunakan StringContentatau ObjectContentyang berasal dari HttpContentatau Anda dapat menggunakan nullsebagai HttpContent:

var response = await client.PostAsync(requestUri, null);


Sepertinya ini hanya dalam .NET framework 4.5? msdn.microsoft.com/en-us/library/…
dan

Ini akan dikirimkan dengan API Web WCF tetapi saya pikir beberapa "bagian yang baik" akan membuatnya menjadi kerangka itu sendiri.
Alexander Zeitler

Mengapa tidak ada metode kelebihan beban yang tidak memerlukan HttpContentkelas? Haruskah kita setidaknya memberikan sesuatu (bahkan string kosong) untuk membuat posting http?
tugberk

75
Anda dapat menggunakan nullsebagai HttpContent, ini tidak akan mengirim isi dalam permintaan, misalnyavar response = await client.PostAsync(requestUri, null);
Owain Williams

105

Lakukan ini sebelumnya, buat sederhana saja:

Task<HttpResponseMessage> task = client.PostAsync(url, null);

7
Ini lebih bersih dari jawaban yang diterima, dan harus dipilih.
David Ebbo

4

Telah menemukan bahwa:

Task<HttpResponseMessage> task = client.PostAsync(url, null);

Menambahkan null ke tubuh permintaan, yang gagal di WSO2. Digantikan dengan:

Task<HttpResponseMessage> task = client.PostAsync(url, new {});

Dan berhasil.


Saya tidak dapat memastikan temuan ini (tetapi saya tidak yakin tes saya benar-benar memadai). Ketika saya POST ke salah satu API saya sendiri dengan nullkonten dan melihat konten yang ditemukan di HttpRequestMessage, saya tampaknya mendapatkan panjang nol byte.
ATAU Mapper

1

Untuk mengatasi masalah ini, gunakan contoh ini:

   using (var client = new HttpClient())
            {
                var stringContent = new StringContent(string.Empty);
                stringContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded");
                var response = client.PostAsync(url, stringContent).Result;
                var result = response.Content.ReadAsAsync<model>().Result;
            }

-6

Saya pikir itu melakukannya secara otomatis jika metode web Anda tidak memiliki parameter atau semuanya cocok dengan template URL.

Misalnya deklarasi ini mengirimkan badan kosong:

  [OperationContract]
  [WebGet(UriTemplate = "mykewlservice/{emailAddress}",
     RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json,
     BodyStyle = WebMessageBodyStyle.Wrapped)]
  void GetStatus(string emailAddress, out long statusMask);

Saya mencoba untuk MENGIRIMKAN tubuh kosong. Metode HttpClient.Post () membutuhkan URI dan objek HttpContent. Saya bukan apa yang harus diteruskan sebagai HttpContent ketika saya tidak ingin mengirim apa pun.
Ryan Rinaldi

Jadi Anda tidak menggunakan WCF. Itu bahkan lebih mudah: ... HttpWebRequest request = (HttpWebRequest) WebRequest.Create ("http: // ..."); request.Method = "POST"; HttpWebResponse respose = (HttpWebResponse) request.GetResponse (); ... Anda menghasilkan tanggapan
Ivan G.

1
Saya menggunakan HttpClient, bukan HttpWebRequest. Menggunakan StringContent dengan string kosong berfungsi.
Ryan Rinaldi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.