출처: https://qiita.com/SKKbySSK_TC/items/bdf2b4395bf3a74ab4c0

HttpClient extension methods

C#로 http를 통한 통신을 할 때 주로 HttpClient를 사용한다.

지금까지 JSON 형식의 응답을 취득할 때는 아래와 같이 3단계로 나누어 구현을 할 필요가 있었다.

// .NET Core 3 이전
var client = new HttpClient();
var response = await client.GetAsync("https://example.com/example.json"); // 1.응답을 받는다
var jsonBody = await response.content.ReadAsStringAsync(); // 2.컨텐츠를 문자열로 읽는다
var data = JsonSerializer.Deserialize<Message>(jsonBody); // 3.디 시리얼리즈

이러면 API 통신을 자주 하는 앱에서는 코드가 장황해져서 불편하다.

. NET 5.0에서는 위의 구현이 보다 간단하게 되었다.

// .NET 5.0
using System.Net.Http.Json;

var client = new HttpClient();
var data = await client.GetFromJsonAsync<Message>("https://example.com/example.json");

또한 아래의 처리가 구현 되어 있다.

다만 응답 Content-Type가 application/json로 되어 있는지는 판정하지 않는 것 같다. text/plain로 시도한 결과 오류 없이 JSON으로 통과 되었다.

위에서는 GET 메소드를 예로 썼는데, POST와 PUT에서도 비슷한 확장 메서드가 추가 되었다. ( PATCH나 DELETE 등에는 추가되지 않은 듯)

물론 POST와 PUT에서는 인수에 어떤 객체를 넘기면 JSON 시리얼라이즈 하여 보낸다.

HttpContent확장 메서드

HttpContent 클래스에 확장 메서드로 ReadFromJsonAsync가 추가 되었다.

이쪽을 사용하면서 임의의 HttpContent에서 JSON 데이터를 다루게 된다.

사용하는 경우는 아래와 같다.

var client = new HttpClient();
var response = await client.GetAsync("https://example.com/example.json");

if (response.IsSuccessStatusCode)
{
 
// OK 처리
 
var data = await response.content.ReadFromJsonAsync<Message>();
}
else
{
 
// NG 처리
 
var data = await response.content.ReadFromJsonAsync<ErrorInfo>();
}

JsonContent

HttpContent를 계승한 JsonContent 클래스가 확장 메서드의 추가에 따라 추가 되었다.

아래 같은 코드를 쓰는 것으로 Content-Type: application/json 를 설정된 JsonContent을 생성할 수 있다. (charset에 따라서 인코딩한다. 기본적으로 UTF-8)

var content = JsonContent.Create<Message>(message); // Content-Type: application/json; charset=utf-8

.NET 5.0이전이라도 쓰고 싶다!

. NET 5.0으로 변경하지 않아도 .NET Core 2.0 또는. NET Framework 4.6.1 이상이면 System.Net.Http.Json 패키지를 추가하면, 같은 기능을 사용할 수 있다.