REST 기반 웹 서비스 사용

Browse sample. 샘플 찾아보기

REST(Representational State Transfer)는 웹 서비스를 빌드하기 위한 아키텍처 스타일입니다. REST 요청은 일반적으로 웹 브라우저에서 웹 페이지를 검색하고 서버에 데이터를 보내는 데 사용하는 것과 동일한 HTTP 동사를 사용하여 HTTPS를 통해 이루어집니다. 동사는 다음과 같습니다.

  • GET – 이 작업은 웹 서비스에서 데이터를 검색하는 데 사용합니다.
  • POST – 이 작업은 웹 서비스에서 데이터의 새 항목을 만드는 데 사용합니다.
  • PUT – 이 작업은 웹 서비스에서 데이터 항목을 업데이트하는 데 사용합니다.
  • PATCH –이 작업은 항목을 수정하는 방법에 대한 지침을 설명하는 방식으로 웹 서비스에서 데이터 항목을 업데이트하는 데 사용합니다.
  • DELETE – 이 작업은 웹 서비스에서 데이터 항목을 삭제하는 데 사용합니다.

REST를 준수하는 웹 서비스 API는 다음을 사용하여 정의됩니다.

  • 기본 URI.
  • GET, POST, PUT, PATCH 또는 DELETE와 같은 HTTP 메서드
  • JSON(JavaScript Object Notation)과 같은 데이터에 대한 미디어 형식입니다.

REST 기반 웹 서비스는 일반적으로 JSON 메시지를 사용하여 데이터를 클라이언트로 반환합니다. JSON은 압축 페이로드를 생성하는 텍스트 기반 데이터 교환 형식으로, 데이터를 보낼 때 대역폭 요구 사항이 줄어듭니다. REST의 단순성은 모바일 앱에서 웹 서비스에 액세스하는 기본 방법을 만드는 데 도움이 되었습니다.

참고 항목

웹 서비스에 액세스하려면 종종 비동기 프로그래밍이 필요합니다. 비동기 프로그래밍에 대한 자세한 내용은 비동기 및 await를 사용한 비동기 프로그래밍을 참조 하세요.

웹 서비스 작업

예제 REST 서비스는 ASP.NET Core를 사용하여 작성되며 다음 작업을 제공합니다.

연산 HTTP 메서드 상대 URI 매개 변수
할 일 항목 목록 가져오기 GET /api/todoitems/
새 할 일 항목 만들기 게시 /api/todoitems/ TodoItem 형식의 JSON
할 일 항목 업데이트 PUT /api/todoitems/ TodoItem 형식의 JSON
할 일 항목 삭제 Delete /api/todoitems/{id}

.NET MAUI 앱 및 웹 서비스는 클래스를 TodoItem 사용하여 스토리지를 위해 웹 서비스에 표시되고 전송되는 데이터를 모델링합니다.

public class TodoItem
{
    public string ID { get; set; }
    public string Name { get; set; }
    public string Notes { get; set; }
    public bool Done { get; set; }
}

ID 속성은 각 TodoItem 개체를 고유하게 식별하는 데 사용되며 웹 서비스에서 업데이트 또는 삭제할 데이터를 식별하는 데 사용됩니다. 예를 들어 ID6bb8a868-dba1-4f1a-93b7-24ebce87e243TodoItem 삭제하려면 .NET MAUI 앱에서 DELETE 요청을 https://hostname/api/todoitems/6bb8a868-dba1-4f1a-93b7-24ebce87e243보냅니다.

Web API 프레임워크가 요청을 받으면 요청을 작업으로 라우팅합니다. 이러한 작업은 클래스의 공용 메서드입니다 TodoItemsController . Web API 프레임워크는 라우팅 미들웨어를 사용하여 들어오는 요청의 URL을 일치시키고 작업에 매핑합니다. REST API는 특성 라우팅을 사용하여 HTTP 동사로 작업을 나타내는 리소스 집합으로 앱의 기능을 모델링해야 합니다. 특성 라우팅은 특성 모음을 사용하여 작업을 경로 템플릿에 직접 매핑합니다. 특성 라우팅에 대한 자세한 내용은 REST API에 대한 특성 라우팅을 참조 하세요. ASP.NET Core를 사용하여 REST 서비스를 빌드하는 방법에 대한 자세한 내용은 네이티브 모바일 애플리케이션에 대한 백 엔드 서비스 만들기를 참조 하세요.

HTTPClient 개체 만들기

.NET 다중 플랫폼 앱 UI(.NET MAUI) 앱은 클래스를 사용하여 웹 서비스에 요청을 전송하여 REST 기반 웹 서비스를 HttpClient 사용할 수 있습니다. 이 클래스는 HTTP 요청을 보내고 URI 식별 리소스에서 HTTP 응답을 수신하는 기능을 제공합니다. 각 요청은 비동기 작업으로 전송됩니다.

HttpClient 앱이 HTTP 요청을 수행해야 하는 한 개체가 유지되도록 클래스 수준에서 개체를 선언해야 합니다.

public class RestService
{
    HttpClient _client;
    JsonSerializerOptions _serializerOptions;

    public List<TodoItem> Items { get; private set; }

    public RestService()
    {
        _client = new HttpClient();
        _serializerOptions = new JsonSerializerOptions
        {
            PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
            WriteIndented = true
        };
    }
    ...
}

JsonSerializerOptions 개체는 웹 서비스에서 받고 웹 서비스로 전송되는 JSON 페이로드의 서식을 구성하는 데 사용됩니다. 자세한 내용은 System.Text.Json을 사용하여 JsonSerializerOptions 인스턴스를 인스턴스화하는 방법을 참조하세요.

데이터 검색

HttpClient.GetAsync 메서드는 URI에서 지정한 웹 서비스에 GET 요청을 보낸 다음 웹 서비스에서 응답을 수신하는 데 사용됩니다.

public async Task<List<TodoItem>> RefreshDataAsync()
{
    Items = new List<TodoItem>();

    Uri uri = new Uri(string.Format(Constants.RestUrl, string.Empty));
    try
    {
        HttpResponseMessage response = await _client.GetAsync(uri);
        if (response.IsSuccessStatusCode)
        {
            string content = await response.Content.ReadAsStringAsync();
            Items = JsonSerializer.Deserialize<List<TodoItem>>(content, _serializerOptions);
        }
    }
    catch (Exception ex)
    {
        Debug.WriteLine(@"\tERROR {0}", ex.Message);
    }

    return Items;
}

데이터는 웹 서비스에서 개체로 HttpResponseMessage 수신됩니다. 상태 코드, 헤더 및 모든 본문을 포함 하 여 응답에 대 한 정보를 포함 합니다. REST 서비스는 HTTP 요청의 성공 여부를 나타내기 위해 속성에서 HttpResponseMessage.IsSuccessStatusCode 가져올 수 있는 응답에 HTTP 상태 코드를 보냅니다. 이 작업의 경우 REST 서비스는 응답에서 HTTP 상태 코드 200(확인)을 보냅니다. 이는 요청이 성공했으며 요청된 정보가 응답에 있음을 나타냅니다.

HTTP 작업이 성공하면 응답의 내용을 읽습니다. 속성은 HttpResponseMessage.Content 응답의 내용을 나타내며 형식 HttpContent입니다. 합니다 HttpContent 클래스를 나타내는 HTTP 본문 및 콘텐츠 헤더와 같은 Content-TypeContent-Encoding입니다. 그런 다음, 메서드를 string 사용하여 콘텐츠를 읽습니다 HttpContent.ReadAsStringAsync . 그런 string 다음 JSON에서 개체로 ListTodoItem 역직렬화됩니다.

Warning

메서드를 ReadAsStringAsync 사용하여 큰 응답을 검색하면 성능에 부정적인 영향을 미칠 수 있습니다. 이러한 경우 응답을 완전히 버퍼링할 필요가 없도록 응답을 직접 역직렬화해야 합니다.

데이터 만들기

HttpClient.PostAsync 메서드는 URI에서 지정한 웹 서비스에 POST 요청을 보낸 다음 웹 서비스에서 응답을 수신하는 데 사용됩니다.

public async Task SaveTodoItemAsync(TodoItem item, bool isNewItem = false)
{
    Uri uri = new Uri(string.Format(Constants.RestUrl, string.Empty));

    try
    {
        string json = JsonSerializer.Serialize<TodoItem>(item, _serializerOptions);
        StringContent content = new StringContent(json, Encoding.UTF8, "application/json");

        HttpResponseMessage response = null;
        if (isNewItem)
            response = await _client.PostAsync(uri, content);
        else
            response = await _client.PutAsync(uri, content);

        if (response.IsSuccessStatusCode)
            Debug.WriteLine(@"\tTodoItem successfully saved.");
    }
    catch (Exception ex)
    {
        Debug.WriteLine(@"\tERROR {0}", ex.Message);
    }
}

이 예제에서 TodoItem 인스턴스는 웹 서비스로 보내기 위해 JSON 페이로드로 직렬화됩니다. 그런 다음 이 페이로드는 메서드를 사용하여 요청하기 전에 웹 서비스로 전송될 HTTP 콘텐츠의 본문에 PostAsync 포함됩니다.

REST 서비스는 HTTP 요청의 성공 여부를 나타내기 위해 속성에서 HttpResponseMessage.IsSuccessStatusCode 가져올 수 있는 응답에 HTTP 상태 코드를 보냅니다. 이 작업에 대한 일반적인 응답은 다음과 같습니다.

  • 201(CREATED) – 요청으로 인해 응답을 보내기 전에 새 리소스가 생성되었습니다.
  • 400(BAD REQUEST) – 서버에서 요청을 인식할 수 없습니다.
  • 409(충돌) – 서버의 충돌로 인해 요청을 수행할 수 없습니다.

데이터 업데이트

HttpClient.PutAsync 메서드는 URI에서 지정한 웹 서비스에 PUT 요청을 보낸 다음 웹 서비스에서 응답을 수신하는 데 사용됩니다.

public async Task SaveTodoItemAsync(TodoItem item, bool isNewItem = false)
{
  ...
  response = await _client.PutAsync(uri, content);
  ...
}

메서드의 PutAsync 작업은 웹 서비스에서 데이터를 만드는 데 사용되는 메서드와 동일합니다 PostAsync . 그러나 웹 서비스에서 전송할 수 있는 응답은 다릅니다.

REST 서비스는 HTTP 요청의 성공 여부를 나타내기 위해 속성에서 HttpResponseMessage.IsSuccessStatusCode 가져올 수 있는 응답에 HTTP 상태 코드를 보냅니다. 이 작업에 대한 일반적인 응답은 다음과 같습니다.

  • 204(콘텐츠 없음) – 요청이 성공적으로 처리되었으며 응답이 의도적으로 비어 있습니다.
  • 400(BAD REQUEST) – 서버에서 요청을 인식할 수 없습니다.
  • 404(찾을 수 없음) – 요청된 리소스가 서버에 없습니다.

데이터 삭제

HttpClient.DeleteAsync 메서드는 URI에서 지정한 웹 서비스에 DELETE 요청을 보낸 다음 웹 서비스에서 응답을 수신하는 데 사용됩니다.

public async Task DeleteTodoItemAsync(string id)
{
    Uri uri = new Uri(string.Format(Constants.RestUrl, id));

    try
    {
        HttpResponseMessage response = await _client.DeleteAsync(uri);
        if (response.IsSuccessStatusCode)
            Debug.WriteLine(@"\tTodoItem successfully deleted.");
    }
    catch (Exception ex)
    {
        Debug.WriteLine(@"\tERROR {0}", ex.Message);
    }
}

REST 서비스는 HTTP 요청의 성공 여부를 나타내기 위해 속성에서 HttpResponseMessage.IsSuccessStatusCode 가져올 수 있는 응답에 HTTP 상태 코드를 보냅니다. 이 작업에 대한 일반적인 응답은 다음과 같습니다.

  • 204(콘텐츠 없음) – 요청이 성공적으로 처리되었으며 응답이 의도적으로 비어 있습니다.
  • 400(BAD REQUEST) – 서버에서 요청을 인식할 수 없습니다.
  • 404(찾을 수 없음) – 요청된 리소스가 서버에 없습니다.

로컬 개발

ASP.NET Core Web API와 같은 프레임워크를 사용하여 REST 웹 서비스를 로컬로 개발하는 경우 웹 서비스 및 .NET MAUI 앱을 동시에 디버그할 수 있습니다. 이 시나리오에서는 Android 에뮬레이터 및 iOS 시뮬레이터에서 HTTP를 통해 웹 서비스를 사용하려면 .NET MAUI 앱에서 텍스트 지우기 HTTP 트래픽을 사용하도록 설정해야 합니다. 자세한 내용은 Android 에뮬레이터 및 iOS 시뮬레이터에서 로컬 웹 서비스에 대한 커넥트 참조하세요.