HttpClient PostAsJsonAsync를 사용하여 ASP.NET Core에서 HTTP POST 메시지 보내기


143

나는 같은 동적 객체를 보내고 싶다

new { x = 1, y = 2 };

HTTP POST 메시지의 본문으로. 그래서 쓰려고 노력합니다

var client = new HttpClient();

하지만 방법을 찾을 수 없습니다

client.PostAsJsonAsync()

그래서 Microsoft.AspNetCore.Http.Extensions 패키지를 project.json에 추가하고 추가하려고했습니다.

using Microsoft.AspNetCore.Http.Extensions; 

to uses 절. 그러나 그것은 도움이되지 않았습니다.

그렇다면 ASP.NET Core에서 JSON 본문으로 POST 요청을 보내는 가장 쉬운 방법은 무엇입니까?


답변:


206

"Microsoft.AspNet.WebApi.Client"패키지에 대한 참조를 추가해야합니다 ( 샘플에 대해서는 이 기사 를 읽으십시오 ).

추가 확장이 없으면 표준 PostAsync방법을 사용할 수 있습니다 .

client.PostAsync(uri, new StringContent(jsonInString, Encoding.UTF8, "application/json"));

jsonInString전화로 얻을 수 있는 가치JsonConvert.SerializeObject(<your object>);


1
그러나 Microsoft.AspNet.WebApi.Client는 ASP.NET Core RC2 라이브러리처럼 보이지 않습니다. 그리고 두 번째 방법은 너무 많은 코드 반복입니다. ((
Rem

@Rem 왜 두 번째 방법을 사용하기 위해 HttpClient 확장 메소드 ( PostAsJsonAsync)를 작성하지 않습니까? 코드 반복을 피할 수 있습니다.
adem caglin

1
확실한. 그러나 나는 뭔가를 놓치고 있는지 알아 내기 위해 질문했습니다. 아직 Core에서 구현되지 않았다고 믿을 수 없습니다!
Rem

1
이 라이브러리는 핵심 /.net 표준 라이브러리가 아니며 System.Net.Http.Formatting이 아직 포팅되지 않았다고 생각합니다.
Chris S

1
이것은 Nuget 패키지 Microsoft.Extensions.Http에서 .NET Core 2.2의 IHttpClientFactory로 작성된 HttpClient에서 작동합니다. 그러나이 방법으로 어떻게 권한 키와 같은 헤더를 추가합니까?
Nick Gallimore

99

이 수업을 사용합니다 :

public class JsonContent : StringContent
{
    public JsonContent(object obj) :
        base(JsonConvert.SerializeObject(obj), Encoding.UTF8, "application/json")
    { }
}

사용 예 :

new HttpClient().PostAsync("http://...", new JsonContent(new { x = 1, y = 2 }));

5
왜 확장 방법이 아닌가? public static class JsonContent {public Task <?> PostAsJSonAsync (이 HttpClient 클라이언트, 객체 toSerializeAsJson) {...}}
TamusJRoyce

2
JsonContent 클래스의 접근 방식과 같은 I
마르코 알베스

Content-Length:HTTP 헤더를 설정합니까 ?
Vyacheslav Napadovsky가

1
@VyacheslavNapadovsky 그것은 HttpClient설정에 달려 있습니다 . 예를 들어 하나의 세트 client.DefaultRequestHeaders.TransferEncodingChunked = true Content-Length헤더가 설정되지 Transfer-Encoding: chunked않고 대신 설정됩니다. 그러나와 같은 클라이언트를 만들면 기본적으로이 콘텐츠 클래스에 대해 var client = new HttpClient();헤더 Content-Length가 설정됩니다.
stop-cran

12

수락 된 답변에 Accept헤더를 추가하고 싶습니다 httpClient.

httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

예, 나에게 이것은 postman을 사용하여 확인해야합니다.
Weihui Guo

1

이것이 .NET Core에서 오랫동안 구현되어 왔습니다.

작성 시점 (2019 년 9 월) project.json에 NuGet 3.x + 파일이 https://docs.microsoft.com/en-us/nuget/archive/project-json에PackageReference 설명 된대로 대체되었습니다 .

클래스 의 *Async메소드에 액세스하려면 파일이 올바르게 구성되어 있어야합니다.HttpClient.csproj

열려있는 .csproj일반 텍스트 편집기에서 파일을하고 있는지 첫 번째 줄이 만들어
<Project Sdk="Microsoft.NET.Sdk.Web">
에서 뾰족한 아웃로 ( https://docs.microsoft.com/en-us/dotnet/core/tools/project-json-to-csproj#the -csproj-format ).

클래스 의 *Async메소드에 액세스하려면 다음 과 같이 파일 에 HttpClient올바른 패키지 참조 가 있어야합니다 .csproj.

<ItemGroup>
    <!-- ... -->
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <!-- ... -->
</ItemGroup>

https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#adding-a-packagereference를 참조 하십시오 . 또한 ASP.NET Core 2.1 및 나중에 Microsoft.AspNetCore.App 메타 패키지 ( https://docs.microsoft.com/en-us/aspnet/core/fundamentals/metapackage )를 사용하십시오.

같은 방법 PostAsJsonAsync, ReadAsAsync, PutAsJsonAsync그리고 DeleteAsync지금은 상자 밖으로 작동합니다. (사용 지시문이 필요하지 않습니다.)

업데이트 : .NET Core 3.0에서는 PackageReference 태그가 더 이상 필요하지 않습니다.


PostAsJsonAsync를 .NET Core 3.1과 함께 사용할 수 없었습니다. 감사합니다
Chris Kolenko
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.