โพสต์เนื้อความว่างเปล่าไปยัง REST API ผ่าน HttpClient


119

API ที่ฉันพยายามโทรต้องการให้ฉันทำ POST แต่มีเนื้อความว่างเปล่า ฉันเพิ่งเริ่มใช้ WCF Web API HttpClient และดูเหมือนจะไม่พบรหัสการเขียนที่จะทำโพสต์ด้วยเนื้อความว่างเปล่า ฉันพบการอ้างอิงถึงเมธอด HttpContent.CreateEmpty () บางอย่าง แต่ฉันไม่คิดว่ามันมีไว้สำหรับโค้ด Web API HttpClient เนื่องจากฉันไม่สามารถหาวิธีนั้นได้


HttpContent.CreateEmpty มาจากต้นแบบ HttpClient เก่าที่เป็นส่วนหนึ่งของ REST Starter kit น่าเสียดายที่ไม่มีสิ่งที่เทียบเท่าใน HttpClient ใหม่
Darrel Miller


1
@MichaelFreidgeim ถ้ามีช่องว่างในความต่อเนื่องของเวลาอวกาศและ 2013 มาก่อนปี 2011 ก็ใช่ว่าจะซ้ำกันได้
Ryan Rinaldi

1
"อาจซ้ำกัน" เป็นวิธีการทำความสะอาด - เพื่อปิดคำถามที่คล้ายกันและเก็บคำตอบที่ดีที่สุดไว้ วันที่ไม่จำเป็น ดูmeta.stackexchange.com/questions/147643/…หากคุณยอมรับว่าต้องการคำชี้แจงโปรดลงคะแนนในmeta.stackexchange.com/questions/281980/…
Michael Freidgeim

คำตอบ:


119

ใช้StringContentหรือObjectContentที่มาจากHttpContentหรือคุณสามารถใช้nullเป็นHttpContent:

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


ดูเหมือนว่าจะอยู่ใน. NET framework 4.5 เท่านั้น? msdn.microsoft.com/en-us/library/...
แดน

มันจะมาพร้อมกับ WCF Web API แต่ฉันคิดว่า "ส่วนที่ดี" บางส่วนจะทำให้มันเข้าสู่เฟรมเวิร์กเอง
Alexander Zeitler

เหตุใดจึงไม่มีวิธีการโอเวอร์โหลดใด ๆ ที่ไม่ต้องใช้HttpContentคลาส? อย่างน้อยเราควรจัดเตรียมบางสิ่งบางอย่าง (แม้กระทั่งสตริงว่างเปล่า) เพื่อสร้างโพสต์ http?
tugberk

75
คุณสามารถใช้nullเป็นสิ่งHttpContentนี้จะไม่ส่งเนื้อหาใด ๆ ในคำขอเช่นvar response = await client.PostAsync(requestUri, null);
Owain Williams

105

ก่อนหน้านี้ทำแบบนี้ง่ายๆ:

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

7
คำตอบนี้สะอาดกว่าคำตอบที่ยอมรับและควรได้รับการโหวต
David Ebbo

4

พบว่า:

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

เพิ่มค่าว่างให้กับเนื้อหาการร้องขอซึ่งล้มเหลวบน WSO2 แทนที่ด้วย:

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

และทำงาน.


ฉันไม่สามารถยืนยันการค้นพบนี้ได้ (แต่ฉันไม่แน่ใจว่าการทดสอบของฉันเพียงพอทั้งหมด) เมื่อฉันโพสต์ไปยัง API ของตัวเองที่มีnullเนื้อหาและดูเนื้อหาที่พบในHttpRequestMessageนั้นดูเหมือนว่าฉันจะมีความยาวเป็นศูนย์ไบต์
หรือ Mapper

1

ในการแก้ปัญหานี้ให้ใช้ตัวอย่างนี้:

   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

ฉันคิดว่ามันทำได้โดยอัตโนมัติถ้าวิธีการบนเว็บของคุณไม่มีพารามิเตอร์หรือทั้งหมดนั้นพอดีกับเทมเพลต URL

ตัวอย่างเช่นการประกาศนี้ส่งเนื้อหาว่าง:

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

ฉันกำลังพยายามส่งร่างที่ว่างเปล่า วิธีการ HttpClient.Post () ต้องการ URI และวัตถุ HttpContent ฉันไม่ใช่สิ่งที่จะส่งผ่านเป็น HttpContent เมื่อฉันไม่ต้องการส่งอะไร
Ryan Rinaldi

คุณไม่ได้ใช้ WCF ง่ายยิ่งขึ้น: ... คำขอ HttpWebRequest = (HttpWebRequest) WebRequest.Create ("http: // ... "); request.Method = "โพสต์"; HttpWebResponse respose = (HttpWebResponse) request.GetResponse (); ... คุณตอบกลับ
Ivan G.

1
ฉันใช้ HttpClient ไม่ใช่ HttpWebRequest การใช้ StringContent กับสตริงว่างได้ผล
Ryan Rinaldi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.