HttpClient를 통해 REST API에 빈 본문 게시


119

호출하려는 API는 POST를 수행해야하지만 본문이 비어 있어야합니다. 나는 WCF 웹 API HttpClient를 처음 사용하는데 빈 본문으로 게시물을 작성하는 코드를 찾을 수없는 것 같습니다. 일부 HttpContent.CreateEmpty () 메서드에 대한 참조를 찾았지만 해당 메서드를 찾을 수 없기 때문에 웹 API HttpClient 코드에 대한 것 같지 않습니다.


HttpContent.CreateEmpty는 REST 스타터 키트의 일부인 이전 HttpClient 프로토 타입에서 가져 왔습니다. 불행히도 새로운 HttpClient에는 이에 상응하는 것이 없습니다.
Darrel Miller


1
@MichaelFreidgeim 시공간 연속체에 구멍이 있었고 어떻게 든 2013 년이 2011 년 이전에왔다면 복제 가능성이 있습니다.
Ryan Rinaldi

1
"가능한 중복"은 정리하는 방법으로 유사한 질문을 닫고 최상의 답변을 유지합니다. 날짜는 필수가 아닙니다. 참조 meta.stackexchange.com/questions/147643/...을 당신이에 설명하십시오 투표를 필요로 동의하는 경우 meta.stackexchange.com/questions/281980/...
마이클 Freidgeim

답변:


119

사용 StringContent또는 ObjectContent파생 HttpContent되거나 다음 null과 같이 사용할 수 있습니다 HttpContent.

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


이것은 .NET Framework 4.5에만있는 것 같습니다. msdn.microsoft.com/en-us/library/…
dan

WCF 웹 API와 함께 제공되지만 "좋은 부분"중 일부가 프레임 워크 자체에 포함될 것이라고 생각합니다.
Alexander Zeitler 2011

HttpContent클래스가 필요하지 않은 오버로드 메서드가없는 이유는 무엇 입니까? http 게시물을 만들기 위해 적어도 무언가 (빈 문자열이라도)를 제공해야합니까?
tugberk

75
당신은 사용할 수 null는 AS HttpContent이 요청 예에서 시체를 보낼 것,var response = await client.PostAsync(requestUri, null);
Owain 윌리엄스

105

이전에이 작업을 수행 했으므로 간단하게 유지하십시오.

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

7
이것은 수락 된 답변보다 명확하며 투표해야합니다.
David Ebbo

4

다음을 발견했습니다.

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

WSO2에서 실패한 요청 본문에 null을 추가합니다. 다음으로 대체 :

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

그리고 일했습니다.


이 결과를 확인할 수 없습니다 (하지만 내 테스트가 완전히 적절했는지는 모르겠습니다). null콘텐츠 가있는 내 API 중 하나에 게시하고 에서 찾은 콘텐츠를 보면 HttpRequestMessage길이가 0 바이트 인 것 같습니다.
OR 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 2011 년

따라서 WCF를 사용하지 않습니다. 훨씬 더 쉽습니다. ... HttpWebRequest request = (HttpWebRequest) WebRequest.Create ( "http : // ..."); request.Method = "POST"; HttpWebResponse respose = (HttpWebResponse) request.GetResponse (); ... 응답 결과
Ivan G.

1
HttpWebRequest가 아닌 HttpClient를 사용하고 있습니다. 빈 문자열로 StringContent를 사용하면 작동합니다.
Ryan Rinaldi 2011 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.