ASP에서 타사 웹 API를 사용하는 방법그물심

현대 웹 응용 프로그램에서 제3자 웹 API를 호출하여 응용 프로그램의 기능을 강화하는 것은 매우 흔히 볼 수 있는 것이다.수천 개의 무료 및 상업 API를 사용할 수 있습니다. 만약 당신이 ASP에서 이 API를 어떻게 사용하는지 알고 있다면.NET 핵심 어플리케이션으로 매우 강력한 비즈니스 어플리케이션을 구축할 수 있습니다.앞서 게시물A Developer’s Guide for Creating Web APIs with ASP.NET Core 5에서 ASP를 소개했습니다.NET 핵심 웹 API에 대한 세부내용입니다.이 문서에서는 ASP에서 타사 웹 API를 사용하는 방법에 대해 설명합니다.NET 핵심 어플리케이션
Download Source Code

타사 API 개요


Google은 국가 코드와 연도를 입력할 수 있는 프로그램을 개발하고 제3자 API를 호출하여 해당 국가의 연도에 대한 공휴일 목록을 가져옵니다.Google이 사용하는 타사 API를 Nager.Date라고 하는데 이것은 전 세계 공휴일 API입니다.

이것은 Postman에서 다음 URL을 입력하여 쉽게 테스트할 수 있는 매우 간단한 API입니다.
https://date.nager.at/api/v2/PublicHolidays/2020/US
이 API의 응답은 다음과 같이 JSON 형식의 공휴일 목록입니다.

HttpClient 객체 이해


가장 흔하고 잘 알려진 클래스로 ASP의 타사 API를 사용할 수 있습니다.NET 핵심 애플리케이션은 HttpClient 클래스입니다.이 클래스를 사용하면 타사 API에 HTTP 요청을 보내고 해당 API에서 반환된 HTTP 응답을 받을 수 있습니다.HttpClient의 각 인스턴스는 자신의 요청을 HttpClient의 다른 인스턴스에서 수행한 요청과 분리할 수 있도록 자체 연결 풀을 유지합니다.이 클래스는 HTTP 클라이언트의 기본 클래스로 사용됩니다.예를 들어, Facebook HttpClient 또는 Twitter HttpClient를 기본 HttpClient의 하위 클래스로 만들 수 있으며, 이러한 특정 HTTP 클라이언트를 사용하여 페이스북 및 트위터 API와 통신할 수 있습니다.
HttpClient 인스턴스를 만들고 전체 응용 프로그램 라이프 사이클에서 재사용하는 것이 좋습니다.각 요청에 대해 새 HttpClient 인스턴스를 인스턴스화하면 사용 가능한 소켓 수를 다시 로드하기 쉽기 때문입니다.이는 HttpClient 객체를 처리할 때 기본 소켓이 즉시 해제되지 않기 때문입니다.너는 내가 방금 언급한 문제에 대한 더 많은 정보를 얻기 위해 이 멋진 블로그 You're using HttpClient wrong and it's destabilizing your software 를 읽을 수 있다.

ASP에서 HttpClient를 사용합니다.그물심


위에서 말한 바와 같이, 우리는 사용자가 모든 국가의 공휴일 목록을 볼 수 있도록 프로그램을 만들 것이다.ASP를 만듭니다.NET 코어 MVC 웹 응용 프로그램과 다음 인터페이스를 만듭니다.이 인터페이스에는 GetHolidays 방법이 하나밖에 없습니다. 두 개의 인자countryCode와 year가 있습니다. 곧 사용자로부터 받을 수 있습니다.
public interface IHolidaysApiService
{
    Task<List<HolidayModel>> GetHolidays(string countryCode, int year);
}
위의 GetHolidays 방법은HolidayModel의 목록을 되돌려줍니다.HolidayModel은 모델 클래스로 그 속성은 Nager.Date API의 응답으로 비칩니다.
public class HolidayModel
{
    public string Name { get; set; }
    public string LocalName { get; set; }
    public DateTime? Date { get; set; }
    public string CountryCode { get; set; }
    public bool Global { get; set; }
}
다음에 우리는 위에서 설명한 IHolidaysApi 서비스 클래스를 실현해야 한다. 이 클래스는 위에서 설명한 IHolidaysApi 서비스를 실현할 것이다.클래스에서 개인 및 정적 HttpClient 변수를 선언하는 방법과 클래스의 정적 구조 함수에 정의되는 방법에 주의하십시오.Microsoftofficial docs에서 언급한 HttpClient 인스턴스를 만드는 데 권장되는 방법입니다.
public class HolidaysApiService : IHolidaysApiService
{
    private static readonly HttpClient client;

    static HolidaysApiService()
    {
        client = new HttpClient()
        {
            BaseAddress = new Uri("https://date.nager.at")
        };
    }
}
다음은 GetHolidays 방법을 다음과 같이 정의해야 합니다.
public async Task<List<HolidayModel>> GetHolidays(string countryCode, int year)
{
    var url = string.Format("/api/v2/PublicHolidays/{0}/{1}", year, countryCode);
    var result = new List<HolidayModel>();
    var response = await client.GetAsync(url);
    if (response.IsSuccessStatusCode)
    {
        var stringResponse = await response.Content.ReadAsStringAsync();

        result = JsonSerializer.Deserialize<List<HolidayModel>>(stringResponse,
            new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
    }
    else
    {
        throw new HttpRequestException(response.ReasonPhrase);
    }

    return result;
}
상술한 방법에서 많은 일이 발생했기 때문에 제가 상세하게 설명해 드리겠습니다.
  • 첫 번째 행은 API를 구성하는 Url이며 연간 및countryCode 매개 변수를 사용합니다.
  • var url = string.Format("/api/v2/PublicHolidays/{0}/{1}", year, countryCode);
    
  • 다음에 GetAsync 방법을 사용하여 API 호출을 진행할 것입니다. 이 방법은 GET 요청을 지정한 Uri에 비동기 동작으로 보낼 것입니다.이 방법은 시스템으로 돌아갑니다.그물Http.HttpResponseMessage 객체는 상태 코드와 데이터가 포함된 HTTP 응답 메시지를 나타냅니다.
  • var response = await client.GetAsync(url);
    
  • 다음에 HTTP 내용을 문자열로 서열화하는 ReadAsstringAsync 방법을 사용합니다
  • var stringResponse = await response.Content.ReadAsStringAsync();
    
  • 마지막으로 우리는 Json Serializer를 사용하여 JSON 응답 문자열을 Holiday 모델 대상 목록으로 반서열화했다.
  • result = JsonSerializer.Deserialize<List<HolidayModel>>(stringResponse,
        new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
    
    이것이 바로 우리가 공휴일 API의 3분의 1을 소비하는 데 필요한 것이다.Google Holidays Api 서비스를 사용하려면 Startup에 Google 서비스를 등록해야 합니다.cs과
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddSingleton<IHolidaysApiService, HolidaysApiService>();
    }
    
    다음에 Holidays Api 서비스를 Home Controller에 주입하고, Index action 방법에서 받는country Code와 year 파라미터를 전달해서GetHolidays 방법을 호출할 수 있습니다.
    public class HomeController : Controller
    {
        private readonly IHolidaysApiService _holidaysApiService;
    
        public HomeController(IHolidaysApiService holidaysApiService)
        {
            _holidaysApiService = holidaysApiService;
        } 
    
        public async Task<IActionResult> Index(string countryCode, int year)
        {
            List<HolidayModel> holidays = new List<HolidayModel>();
            holidays = await _holidaysApiService.GetHolidays(countryCode, year);
    
            return View(holidays);
        }
    }
    
    마지막으로, 우리는 국가 코드와 연도를 입력할 수 있는 폼을 만들기 위해 Razor 보기가 필요합니다.양식은 위의 색인 작업에 제출되며 GetHolidays 메서드를 호출합니다.이것은 색인의 코드다.cshtml Razor 보기에는 HTML 양식과 공휴일을 표시하는 테이블이 표시됩니다.
    @model List<HolidayModel>
    @{
        ViewData["Title"] = "Home Page";
    }
    <div>
        <h3 class="display-4">Public Holidays Finder</h3>
        <center>
            <form asp-controller="Home" asp-action="Index">
                <table>
                    <tr>
                        <td>Country Code: </td>
                        <td><input type="text" id="txtCountryCode" name="CountryCode" /></td>
                        <td>Year: </td>
                        <td><input type="text" id="txtYear" name="Year" /></td>
                        <td><input type="submit" value="Submit" /></td>
                    </tr>
                </table>
                <hr />
            </form>
        </center>
        @if (Model != null && Model.Count > 0)
        {
            <table class="table table-bordered table-striped table-sm">
                <thead>
                <tr>
                    <th>Date</th>
                    <th>Name</th>
                    <th>Local Name</th>
                    <th>Country Code</th>
                    <th>Global</th>
                </tr>
                </thead>
                <tbody>
                @foreach (var item in Model)
                {
                    <tr>
                        <td>@item.Date.Value.ToShortDateString()</td>
                        <td>@Html.DisplayFor(modelItem => item.Name)</td>
                        <td>@Html.DisplayFor(modelItem => item.LocalName)</td>
                        <td>@Html.DisplayFor(modelItem => item.CountryCode)</td>
                        <td>@Html.DisplayFor(modelItem => item.Global)</td>
                    </tr>
                }
                </tbody>
            </table>
        }
    
    </div>
    
    이제 타사 API를 사용할 수 있는지 테스트할 때가 되었습니다.VisualStudio 에서 F5 키를 누르면 다음과 같은 페이지가 표시됩니다.US, DE 등 국가 코드를 입력하고 2021년, 예를 들어 제출 단추를 누르면 저희 코드가 제3자 API를 호출하여 API에서 공휴일 목록을 가져와 페이지에 표시할 수 있습니다.
    Nager.Date

    IHttpClientFactory를 사용하여 HttpClient 객체 관리

    HttpClient 실례를 관리하기 쉽고 상술한 플러그인 소모 문제를 피하기 위해서다.NET Core 2.1에는 종속 주입(DI)을 통해 응용 프로그램에서 HttpClient 인스턴스를 구성하고 생성하는 데 사용할 수 있는 인터페이스가 도입되었습니다.IHttpClientFactory를 사용하려면 Startup에 등록할 수 있습니다.호출IHttpClientFactory을 통해 cs 파일을 보냅니다.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
    
        services.AddSingleton<IHolidaysApiService, HolidaysApiService>();
    
        services.AddHttpClient("PublicHolidaysApi", c => c.BaseAddress = new Uri("https://date.nager.at"));
    }
    
    AddHttpClient 방법을 사용하여 여러 HTTP 클라이언트를 등록할 수 있습니다.AddHttpClient 메서드의 첫 번째 매개변수는 클라이언트 이름이고, 두 번째 매개변수는 HttpClient를 구성하는 Lamba 표현식입니다.위의 예에서, 나는 이 특정 HTTP 클라이언트가 호출하는 제3자 API의 Url을 사용하여BaseAddress 속성을 설정하고 싶다.
    HTTP 클라이언트를 등록하면 컨트롤러와 서비스에 IHttp 클라이언트 팩토리를 주입하고 코드에 사용할 특정 HTTP 클라이언트 대상을 만들기 위해 Create 클라이언트 방법을 호출할 수 있습니다.CreateClient 메서드에서 작성해야 하는 HTTP 클라이언트의 이름은 다음과 같습니다.
    public class HolidaysApiService : IHolidaysApiService
    {
        private readonly HttpClient client;
    
        public HolidaysApiService(IHttpClientFactory clientFactory)
        {
            client = clientFactory.CreateClient("PublicHolidaysApi");
        }
    
        public async Task<List<HolidayModel>> GetHolidays(string countryCode, int year)
        {
            var url = string.Format("/api/v2/PublicHolidays/{0}/{1}", year, countryCode);
            var result = new List<HolidayModel>();
            var response = await client.GetAsync(url);
            if (response.IsSuccessStatusCode)
            {
                var stringResponse = await response.Content.ReadAsStringAsync();
    
                result = JsonSerializer.Deserialize<List<HolidayModel>>(stringResponse,
                    new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
            }
            else
            {
                throw new HttpRequestException(response.ReasonPhrase);
            }
    
            return result;
        }
    }
    

    AddHttpClient(IServiceCollection) 요약


    이 문서에서는 HttpClient에 대해 간략하게 설명하고 HttpClient 객체를 직접 작성하거나 IHttpClientFactory를 사용하여 HttpClient 객체를 작성하는 예를 보여 줍니다.HttpClient를 사용하여 타사 웹 API를 호출하는 예도 보여 드리겠습니다.이제 HttpClient 객체와 그 사용법을 숙지하고 프로젝트에서 사용할 수 있도록 자신감을 가지시기 바랍니다.

    좋은 웹페이지 즐겨찾기