HttpClient를 통해 REST 서비스 사용

완료됨

많은 최신 웹 서비스는 REST 아키텍처를 구현합니다. 이 구조를 사용하면 웹 서비스가 잘 정의된 일련의 엔드포인트를 통해 작업 및 데이터를 노출할 수 있습니다. 클라이언트 앱이 데이터를 검색, 수정, 생성 또는 삭제하기 위해 REST 웹 서비스에 보내는 요청은 미리 정의된 동사 집합을 사용합니다. REST 웹 서비스는 표준 방식으로 이러한 요청에 응답합니다. 이 방법을 사용하면 클라이언트 앱을 더 쉽게 구성할 수 있습니다.

REST 모델은 HTTP 프로토콜을 기반으로 빌드됩니다. .NET MAUI 애플리케이션은 HttpClient 클래스를 사용하여 REST 웹 서비스에 요청을 보낼 수 있습니다. 이 단원에서는 HttpClient와 이를 REST 웹 서비스와 상호 작용하는 데 사용하는 방법에 대해 알아봅니다.

HttpClient 클래스란?

HttpClient는 앱이 REST 웹 서비스에 HTTP 요청을 보내고 HTTP 응답을 수신하는 데 사용할 수 있는 .NET 클래스입니다. URI 집합은 웹 서비스가 노출하는 리소스를 식별합니다. URI는 웹 서비스의 주소를 해당 주소에서 사용할 수 있는 리소스의 이름과 결합합니다.

HttpClient 클래스는 성능을 위해 작업 기반 API를 사용하며, 전송 및 수신되는 실제 데이터가 포함된 메시지 본문뿐만 아니라 HTTP 헤더, 상태 코드와 같은 요청 메시지의 정보에 대한 액세스도 제공합니다.

Diagram showing how a client app uses an HttpClient object to send and receive HTTP messages and responses

HttpClient 클래스는 System.Net.Http 네임스페이스에서 사용할 수 있습니다. 앱은 기본 생성자를 사용하여 HttpClient 개체를 만들 수 있습니다.

using System.Net.Http;
...

var client = new HttpClient();

HttpClient 개체를 사용하여 CRUD 작업 수행

REST 웹 서비스를 사용하면 클라이언트가 HTTP 동사 집합을 통해 데이터에 대한 작업을 수행할 수 있습니다. HTTP 동사의 역할은 리소스에 대해 수행할 원하는 작업을 나타내는 것입니다. 많은 HTTP 동사가 있지만 가장 일반적인 동사는 POST, GET, PUTDELETE입니다. 서비스는 다음과 같이 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업을 수행하여 이러한 동사를 구현하고 클라이언트 애플리케이션이 개체의 수명 주기를 관리하도록 지원합니다.

  • POST 동사는 새 리소스를 만들려고 한다는 것을 나타냅니다.

  • GET 동사는 리소스를 검색하려고 한다는 것을 나타냅니다.

  • PUT 동사는 리소스를 업데이트하려고 한다는 것을 나타냅니다.

  • DELETE 동사는 리소스를 삭제하려고 한다는 것을 나타냅니다.

Diagram showing the basic CRUD operations that a REST service can implement, including get, post, put and delete.

HttpClient로 새 리소스 만들기

HttpClient를 사용해 새 리소스를 만들려면 이를 HttpRequestMessage 개체에 전달하는 SendAsync 메서드를 사용할 수 있습니다.

HttpRequestMessage는 웹 서비스로 전송되는 요청을 모델링하기 위한 것입니다. HTTP 동사, 웹 서비스의 URL을 지정하고 HttpRequestMessage.Content 속성을 통해 보낼 페이로드를 채웁니다.

HttpClient client = new HttpClient();

HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Post, url);
message.Content = JsonContent.Create<Part>(part);

HttpResponseMessage response = await client.SendAsync(message);

이 코드 조각은 다음 작업을 수행합니다.

  • 메시지를 보내는 데 사용하는 client라는 HttpClient의 인스턴스를 만듭니다.
  • 메시지를 모델링하는 데 사용하는 message라는 HttpRequestMessage의 인스턴스를 만듭니다. message에는 HTTP 동사와 URL이 있습니다.
  • JsonContent.Create 함수를 사용하여 HttpRequestMessageContent 속성을 설정합니다. 이 함수는 part 변수를 웹 서비스로 보내기에 적합한 JSON으로 자동으로 직렬화합니다.
  • HttpClient 개체를 사용하여 메시지를 보냅니다. HttpResponseMessage는 상태 코드 및 웹 서비스에서 반환하는 정보와 같은 정보가 포함됩니다.

HttpClient로 리소스 읽기

HttpMethod.Get으로 HttpRequestMessage를 초기화하는 것을 제외하고 이전에 설명한 것과 동일한 기술을 사용하여 웹 서비스에서 리소스를 읽을 수 있습니다. 그러나 HttpClient에는 바로 가기를 제공하는 몇 가지 편의 메서드가 있습니다.

HTTPClient를 사용하여 리소스를 읽으려면 다음 예제와 같이 GetStringAsync 메서드를 사용합니다.

HttpClient client = new HttpClient();

string text = await client.GetStringAsync("https://...");

GetStringAsync 메서드는 리소스를 참조하는 URI를 사용하고 응답을 문자열로 반환합니다. 문자열 응답은 앱이 요청한 리소스입니다. 응답 데이터 서식은 JSON 또는 XML과 같은 요청된 서비스의 기본값입니다. 앱은 MediaTypeWithQualityHeaderValue 헤더를 추가하여 데이터를 특정 형식으로 반환해야 한다고 웹 서비스에 알릴 수 있습니다. 예를 들어 앱에서 데이터를 JSON 형식으로 다시 전송하도록 요청하는 경우 다음 코드를 사용할 수 있습니다.

HttpClient client = new HttpClient();

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

이 예제에서는 결과가 문자열로 반환되고 응답 메시지 본문만 포함됩니다. 헤더, 본문 및 상태 코드를 포함한 전체 응답을 가져오려면 GetAsync 메서드를 호출합니다. 데이터가 HttpResponseMessage 개체로 반환됩니다.

HttpClient로 리소스 업데이트

HttpClient를 사용하여 리소스를 업데이트하려면 PUT 동사로 초기화된 HttpRequestMessage를 사용합니다. 다음 코드는 새 리소스를 만드는 데 필요한 코드와 유사합니다.

HttpClient client = new HttpClient();
HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Put, url);

message.Content = JsonContent.Create<Part>(part);

HttpResponseMessage response = await client.SendAsync(message);

참고

POSTPUT 사이의 근본적인 차이는 멱등성입니다. 동일한 PUT 요청을 여러 번 반복하면 동일한 리소스가 동일한 데이터로 업데이트되고 요청이 한 번만 전송된 경우와 효과가 동일합니다. 동일한 POST 요청을 여러 번 실행하면 REST 서비스가 리소스의 여러 복사본을 만들게 됩니다.

HttpClient로 리소스 삭제

HttpClient을(를) 사용하여 리소스를 삭제하려면 다음과 같이 DELETE 동사로 초기화된 HttpRequestMessage을(를) 사용하여 SendAsync을(를) 호출합니다.

HttpClient client = new HttpClient();
HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Delete, url);

HttpResponseMessage response = await client.SendAsync(message);

응답은 헤더, 상태 코드 및 삭제된 개체를 포함합니다.

요청의 응답 처리

모든 HTTP 요청은 응답 메시지를 반환합니다. 응답의 데이터는 앱이 보낸 동사에 따라 달라집니다. 예를 들어 HTTP GET 요청의 응답 본문에는 요청된 리소스에 대한 데이터가 포함됩니다.

응답 본문 POST 요청은 생성된 리소스의 복사본을 반환하지만 PUT 요청의 응답 본문은 비어 있어야 합니다.

응답 메시지에서 상태 코드를 항상 확인하고 처리해야 합니다. 이 상태 코드가 200 범위(200, 201, 202 등)에 있는 경우 나중에 추가 정보가 필요할 수 있지만 작업이 성공한 것으로 간주됩니다.

300 범위의 상태 코드는 리소스가 다른 위치로 이동한 결과로 웹 서비스에서 요청을 다른 주소로 리디렉션했을 수 있음을 나타냅니다.

400 범위의 상태 코드는 클라이언트 또는 애플리케이션 오류를 나타냅니다. 예를 들어 상태 코드 403은 웹 서비스에서 사용자를 인증하도록 요구하는데 앱이 인증하지 않았음을 의미합니다. 상태 코드 404는 앱이 존재하지 않는 리소스에 액세스하려고 할 때 발생합니다.

500 범위의 상태 코드는 서비스를 사용할 수 없거나 너무 바빠서 요청을 처리하지 못하는 등의 서버 쪽 오류를 나타냅니다.

HttpClient 개체를 통해 제출된 요청에서 반환된 HttpResponseMessage 개체는 다양한 상태 코드를 처리하는 복잡성의 대부분을 추상화할 수 있습니다. 이 코드 조각은 응답 메시지의 상태 코드가 성공을 나타내는지 확인하고 일부 실패를 나타내는 상태 코드를 처리하는 방법을 보여 줍니다.

static readonly HttpClient client = new HttpClient();

...
// Call asynchronous network methods in a try/catch block to handle exceptions.
try
{
    //... Initiate the HttpRequest

    HttpResponseMessage response = await client.SendAsync(msg);
    response.EnsureSuccessStatusCode(); // Check that the status code is in the 200 range. Throw an HttpRequestException if not
    
    string responseBody = await response.Content.ReadAsStringAsync();
    
    ... // Handle the response
}
catch(HttpRequestException e)
{
    ... // Handle any status codes that indicate an error. 
        // The status code is available in the field e.StatusCode
}

지식 점검

1.

REST 웹 서비스에서 새 리소스를 만드는 데 어떤 HTTP 동사를 사용하나요?

2.

HTTP 요청이 성공했는지 확인하기 위해 HttpResponseMessage 클래스의 어떤 메서드를 호출해야 하나요?”