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.