ASP에서 타사 웹 API를 사용하는 방법그물심
12335 단어 programmingaspnetcoredotnetwebapi
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;
}
상술한 방법에서 많은 일이 발생했기 때문에 제가 상세하게 설명해 드리겠습니다.var url = string.Format("/api/v2/PublicHolidays/{0}/{1}", year, countryCode);
var response = await client.GetAsync(url);
var stringResponse = await response.Content.ReadAsStringAsync();
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 객체와 그 사용법을 숙지하고 프로젝트에서 사용할 수 있도록 자신감을 가지시기 바랍니다.
Reference
이 문제에 관하여(ASP에서 타사 웹 API를 사용하는 방법그물심), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ezzylearning/how-to-consume-third-party-web-apis-in-asp-net-core-16d4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)