HttpClient aracılığıyla REST API'ye boş bir gövde gönderin


119

Aramaya çalıştığım API, bir POST yapmamı gerektiriyor, ancak gövdesi boş. WCF Web API HttpClient'i kullanma konusunda yeniyim ve boş gövdeli bir gönderi yapacak yazma kodunu bulamıyorum. Bazı HttpContent.CreateEmpty () yöntemine başvurular buluyorum, ancak bu yöntemi bulamadığım için bunun Web API HttpClient kodu için olduğunu düşünmüyorum.


HttpContent.CreateEmpty, REST Starter kitinin parçası olan eski HttpClient prototipindendi. Maalesef yeni HttpClient'te eşdeğeri yoktur.
Darrel Miller


1
@MichaelFreidgeim Uzay zaman sürekliliğinde bir boşluk varsa ve bir şekilde 2013 2011'den önce geldiyse, evet bu olası bir kopya.
Ryan Rinaldi

1
"Olası yineleme", benzer soruları kapatmanın ve en iyi yanıtları içeren birini tutmanın bir yoludur. Tarih önemli değildir. Bkz meta.stackexchange.com/questions/147643/... bunu üzerine açıklama lütfen oyu gerektirdiğini kabul ediyorsanız meta.stackexchange.com/questions/281980/...
Michael Freidgeim

Yanıtlar:


119

Kullanım StringContentveya ObjectContenthangi türetmek HttpContentveya kullanabilirsiniz nullolarak HttpContent:

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


Görünüşe göre bu sadece .NET framework 4.5'te mi? msdn.microsoft.com/en-us/library/…
dan

WCF Web API ile birlikte gönderilecek, ancak bazı "iyi kısımların" onu çerçevenin kendisine dahil edeceğini düşünüyorum.
Alexander Zeitler

Neden bir HttpContentsınıf gerektirmeyen aşırı yükleme yöntemleri yok ? Bir http gönderisi yapmak için en azından bir şey (hatta boş bir dize) sağlamalı mıyız?
tugberk

75
Sen kullanabilirsiniz nullolarak HttpContentbu isteği, örneğin hiçbir bedeni gönderecek,var response = await client.PostAsync(requestUri, null);
Owain Williams

105

Bunu daha önce yaptım, basit tutun:

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

7
Bu, kabul edilen cevaptan daha temiz ve oylanmalıdır.
David Ebbo

4

Bunu bulduk:

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

WSO2'de başarısız olan istek gövdesine boş ekler. Şununla değiştirildi:

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

Ve çalıştı.


Bu bulguyu doğrulayamıyorum (ancak testimin tamamen yeterli olduğundan emin değilim). Bir nulliçerikle kendi API'lerimden birine POST yaptığımda ve içinde bulunan içeriğe baktığımda, HttpRequestMessagesıfır baytlık bir uzunluk elde ediyor gibi görünüyorum.
VEYA Mapper

1

Bu sorunu çözmek için şu örneği kullanın:

   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

Web yönteminizin parametresi yoksa veya tümü URL şablonuna uyuyorsa, bunu otomatik olarak yaptığını düşünüyorum.

Örneğin bu bildirim boş gövde gönderir:

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

Boş bir ceset göndermeye çalışıyorum. HttpClient.Post () yöntemi, bir URI ve bir HttpContent nesnesi gerektirir. Hiçbir şey göndermek istemediğimde HttpContent olarak neyi ileteceğimi bilmiyorum.
Ryan Rinaldi

Yani WCF kullanmıyorsunuz. Bu daha da kolay: ... HttpWebRequest request = (HttpWebRequest) WebRequest.Create ("http: // ..."); request.Method = "POST"; HttpWebResponse yanıtlama = (HttpWebResponse) request.GetResponse (); ... yanıt verdiniz
Ivan G.

1
HttpWebRequest değil, HttpClient kullanıyorum. StringContent'i boş bir dizeyle kullanmak işe yaradı.
Ryan Rinaldi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.