Đăng phần thân trống lên REST API qua HttpClient


119

API tôi đang cố gọi yêu cầu tôi thực hiện ĐĂNG nhưng với phần thân trống. Tôi mới sử dụng WCF Web API HttpClient và dường như tôi không thể tìm ra mã viết sẽ thực hiện một bài đăng với phần thân trống. Tôi tìm thấy các tham chiếu đến một số phương thức HttpContent.CreateEmpty (), nhưng tôi không nghĩ rằng đó là cho mã HttpClient của Web API vì dường như tôi không thể tìm thấy phương thức đó.


HttpContent.CreateEmpty là từ nguyên mẫu HttpClient cũ, là một phần của bộ REST Starter. Thật không may, không có tương đương trong HttpClient mới.
Darrel Miller


1
@MichaelFreidgeim Nếu có một lỗ hổng trong liên tục thời gian không gian và bằng cách nào đó năm 2013 đến trước năm 2011, thì vâng, nó có thể là một bản sao.
Ryan Rinaldi

1
"Có thể trùng lặp" là một cách để làm sạch - để đóng các câu hỏi tương tự và giữ một câu có câu trả lời tốt nhất. Ngày không phải là điều cần thiết. Xem meta.stackexchange.com/questions/147643/... Nếu bạn đồng ý rằng nó đòi hỏi làm rõ phiếu xin vui lòng vào meta.stackexchange.com/questions/281980/...
Michael Freidgeim

Câu trả lời:


117

Sử dụng StringContenthoặc ObjectContentcó nguồn gốc từ HttpContenthoặc bạn có thể sử dụng nullnhư HttpContent:

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


Có vẻ như điều này chỉ có trong .NET framework 4.5? msdn.microsoft.com/en-us/library/…
dan

Nó sẽ xuất xưởng với WCF Web API nhưng tôi nghĩ một số "phần tốt" sẽ tự đưa nó vào khuôn khổ.
Alexander Zeitler

Tại sao không có bất kỳ phương thức quá tải nào không yêu cầu một HttpContentlớp? Ít nhất chúng ta có nên cung cấp một cái gì đó (thậm chí một chuỗi trống) để tạo một bài đăng http không?
tugberk

75
Bạn có thể sử dụng nullnhư là HttpContent, điều này sẽ không gửi nội dung nào trong yêu cầu, ví dụ:var response = await client.PostAsync(requestUri, null);
Owain Williams

105

Đã làm điều này trước đây, chỉ cần giữ nó đơn giản:

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

7
Đây là câu trả lời rõ ràng hơn so với câu trả lời được chấp nhận và nên được bỏ phiếu.
David Ebbo

4

Đã thấy rằng:

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

Thêm null vào nội dung yêu cầu, không thành công trên WSO2. Thay thế bằng:

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

Và đã hoạt động.


Tôi không thể xác nhận phát hiện này (nhưng tôi không chắc bài kiểm tra của tôi hoàn toàn phù hợp). Khi tôi ĐĂNG lên một trong các API của riêng mình với một nullnội dung và xem nội dung được tìm thấy trong HttpRequestMessage, tôi dường như nhận được độ dài bằng 0 byte.
HOẶC Người vẽ bản đồ

1

Để giải quyết vấn đề này, hãy sử dụng ví dụ sau:

   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

Tôi nghĩ rằng nó thực hiện điều đó một cách tự động nếu phương thức web của bạn không có tham số hoặc tất cả chúng đều phù hợp với mẫu URL.

Ví dụ: khai báo này gửi nội dung trống:

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

Tôi đang cố GỬI một cơ thể trống rỗng. Phương thức HttpClient.Post () yêu cầu một URI và một đối tượng HttpContent. Tôi không phải là thứ để chuyển với tư cách HttpContent khi tôi không muốn gửi bất cứ thứ gì.
Ryan Rinaldi,

Vì vậy, bạn không sử dụng WCF. Điều đó thậm chí còn dễ dàng hơn: ... HttpWebRequest request = (HttpWebRequest) WebRequest.Create ("http: // ..."); request.Method = "POST"; HttpWebResponse respose = (HttpWebResponse) request.GetResponse (); ... bạn có phản hồi
Ivan G.

1
Tôi đang sử dụng HttpClient, không phải HttpWebRequest. Sử dụng StringContent với một chuỗi trống đã hoạt động.
Ryan Rinaldi,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.