웹 API에서 HttpClient를 사용하여 JsonObject 게시


289

Web API에서 JsonObject사용 을 POST하려고합니다 HttpClient. 이 문제를 해결하는 방법을 잘 모르겠으며 샘플 코드를 많이 찾을 수 없습니다.

여기까지 내가 가진 것입니다 :

var myObject = (dynamic)new JsonObject();
myObject.Data = "some data";
myObject.Data2 = "some more data";

HttpClient httpClient = new HttpClient("myurl");
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

HttpResponseMessage response = httpClient.Post("", ???);

나는 내 JsonObject것으로 캐스팅해야한다고 생각 StreamContent하지만 그 단계에 매달리고 있습니다.

답변:


441

패키지 의 새 버전 HttpClientWebApi패키지가없는 경우 :

var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
var result = client.PostAsync(url, content).Result;

또는 원하는 경우 async:

var result = await client.PostAsync(url, content);

3
오버로드 된 StringContent 생성자는 나를 위해 속임수를 썼습니다.
캡틴 켄 파치

23
한번 더 생각해 비록 비동기 방식에 결과를 호출하기 전에 blog.stephencleary.com/2012/07/dont-block-on-async-code.html
Ruchira

2
using나는 이것을 다음 과 같이 던지려는 유혹을받은 사람에게 : aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
maxshuty

나는 창조물 using주위에 뒀다 StringContent.
bcr

이 답변을 사용하여 API에서 "400 Bad Request"응답을 계속 수신했습니다. JSON 요청을 (Visual Studio 2017, .NET 4.6.2)에 게시했습니다. 이외에var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json") 설정해야했습니다 content.Headers.ContentType = new MediaTypeHeaderValue("application/json");. 자세한 내용은 아래 답변을 참조하십시오.
anthls

161

가장 쉬운 방법은 StringContentJSON 객체의 JSON 표현과 함께 를 사용하는 것 입니다.

httpClient.Post(
    "",
    new StringContent(
        myObject.ToString(),
        Encoding.UTF8,
        "application/json"));

14
컨텐츠 유형에 유의하십시오. 나는 그것을 버리고 내가 원하는 것보다 훨씬 오랫동안 디버깅하도록했다.
Zapnologica 2016 년

그래도 StringContent 인스턴스를 폐기해서는 안됩니까?
Phil Haselden

63

.NET 버전에 따라 사용할 수도 있습니다 HttpClientExtensions.PostAsJsonAsync 방법 .

https://msdn.microsoft.com/en-us/library/system.net.http.httpclientextensions.postasjsonasync.aspx


4
이제 Microsoft.AspNet.Client.WebApi에서 찾을 수 있습니다
jle

2
방금 Microsoft.AspNet.WebApi.Client에서 설치했습니다
Adriaan Davel

이것은 내 문제를 해결했습니다. client.PostAsync, client.SendAsync를 사용하여 List였던 일부 속성이 포함 된 C # 클래스를 전달하는 동안 (긴) 엉망이되었습니다. 매우 혼합 된 결과를 얻었습니다. 배열이 비어 있으면 API 솔루션이 선택하지만 배열에 항목이 있으면 컨트롤러 메소드가 JSON을 바인드 할 수 없습니다. 고마워. PostAsJsonAsync가 복잡한 C # 객체를 JSON으로보다 안정적으로 변환하는 것으로 보입니다.
Franklin Tarter

이것에 대한 너겟 패키지가 있습니까? 프로젝트를 새 컴퓨터로 옮길 때 나는 그것을 싫어합니다.이 참조는 항상 누락되었습니다.
Zapnologica 2016 년

이것 또는 다른 것을 찾고 계십니까? nuget.org/packages/Microsoft.AspNet.WebApi.Client
user3285954

51

Newtonsoft.Json을 사용하는 경우 :

using Newtonsoft.Json;
using System.Net.Http;
using System.Text;

public static class Extensions
{
    public static StringContent AsJson(this object o)
        => new StringContent(JsonConvert.SerializeObject(o), Encoding.UTF8, "application/json");
}

예:

var httpClient = new HttpClient();
var url = "https://www.duolingo.com/2016-04-13/login?fields=";
var data = new { identifier = "username", password = "password" };
var result = await httpClient.PostAsync(url, data.AsJson())

이것은 asp.net 코어에 국한된 것이 아니며 실제로는 심지어 4.5.6까지입니다.
danatcofo

JsonConvert.SerializeObjectDateTimes ISO 8601 사용시 문제 : 로컬 또는 UTC ... hackered.co.uk/articles/…
Kiquenet

21

pomber의 답변에 대한 의견을 추가 할만 큼 평판이 충분하지 않아 다른 답변을 게시하고 있습니다. pomber의 접근 방식을 사용하여 API에서 "400 Bad Request"응답을 계속 수신했습니다 .JSON 요청을 게시했습니다 (Visual Studio 2017, .NET 4.6.2). 결국 문제는 StringContent ()에 의해 생성 된 "Content-Type"헤더로 잘못 추적되었습니다 ( https://github.com/dotnet/corefx/issues/7864 참조). ).

tl; dr

추가 행과 함께 pomber의 답변을 사용하여 요청에 헤더를 올바르게 설정하십시오.

var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var result = client.PostAsync(url, content).Result;

고마워요 var content = new StringContent (jsonObject.ToString (), Encoding.UTF8, "application / json")이 충분하지 않습니다. content.Headers.ContentType = new MediaTypeHeaderValue ( "application / json")이 필요합니다. 제 정신을 구 해주셔서 감사합니다.
게일 Foad

1
이것은 훌륭하게 작동했습니다. "application / json"을 생성자에서 한 번, 속성을 통해 한 번 두 번 설정해야하는 이유가 있습니까? 버그입니까?
Festus Martingale

@FestusMartingale : 좋은 질문입니다! github 문제 (답변에 링크 됨)를 읽었을 "application/json"StringContent생성자 에서 전달 하는 것이 결과 content.Headers.ContentType속성 에 명시 적으로 설정되어 있기 때문에 필요하지 않을 것입니다 . 그러나 코드에서 이것을 테스트하지 않았습니다.
anthls

서버가 전체 컨텐츠 유형 문자열을 지원하지 않는 것 같습니다. ContentType을 재정의하지 않고 생성자를 사용하면 값이로 설정됩니다 application/json; charset=utf-8.
Bertm13

2

vbnet의 코드 :

dim FeToSend as new (object--> define class)

Dim client As New HttpClient
Dim content = New StringContent(FeToSend.ToString(), Encoding.UTF8,"application/json")
content.Headers.ContentType = New MediaTypeHeaderValue( "application/json" )
Dim risp = client.PostAsync(Chiamata, content).Result

msgbox(risp.tostring)

이 도움을 바랍니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.