최소 API에서 쿼리 문자열에 액세스하는 방법

나는 이 직업이 내가 매일 새로운 것을 배울 수 있게 해준다는 것을 좋아합니다. 이 경우에는 예정된 일부 과정Pluralsight에 사용할 간단한 API를 구축하고 있었습니다. Minimal API를 사용하여 Bechdel Tests for Films의 이전 데이터 세트FiveThirtyEight에 대한 일부 데이터를 노출하고 싶었습니다. 페이징을 추가하는 동안 혼란스러워졌습니다.

그래서 저는 다음과 같이 모든 영화를 얻기 위한 최소한의 API로 시작했습니다.

app.MapGet("api/films", async (BechdelDataService ds) =>
{

  if (ds is null) return Results.BadRequest();
  FilmResult data = await ds.LoadAllFilmsAsync();
  if (data.Results is null) return Results.NotFound();

  return Results.Ok(data);

}).WithTags("By Film").Produces(200).ProducesProblem(404);



약간의 데이터를 얻기 위한 매우 간단한 Minimal API입니다(내 BechdelDataService는 저장소와 같은 클래스일 뿐입니다). 페이징을 추가할 때 선택적 매개 변수를 사용하는 일반적인 웹 API 트릭을 사용하고 싶었습니다.

app.MapGet("api/films", async (BechdelDataService ds, 
  int page = 1, 
  int pageSize = 50) =>
{
...
}).WithTags("By Film").Produces(200).ProducesProblem(404);



놀랍게도 이것은 작동하지 않았습니다. 내가 예상한 것은 쿼리 문자열을 사용하면 이름으로 추가 매개 변수에 바인딩된다는 것입니다.

/api/films?page=1
/api/films



이 경우 이들은 동일해야 합니다. 무슨 일이야. 처음에는 Minimal API가 이것을 지원하지 않는 이유를 알아보았습니다. 나는 그것에 대해 많이 보지 못했고 쿼리 문자열을 수동으로 읽는 옵션을 보았습니다.

app.MapGet("api/films", async (
    HttpRequest request, 
    BechdelDataService ds) =>
{
  var page = request.Query["page"] ?? 1;
  var size = request.Query["pageSize"] ?? 50;

...


}).WithTags("By Film").Produces(200).ProducesProblem(404);



이것은 작동하지만 투박하다는 것을 알았습니다. 나는 바인딩이 작동하기를 원했습니다. 람다를 메서드로 분리한 몇 가지 예를 보았습니다.

app.MapGet("api/films", GetAllFilms);

async Task<IResult> GetAllFilms(BechdelDataService ds, 
  int page = 1, 
  int pageSize = 50)
{
    ...
}



이것은 작동하므로 Minimal API에는 문제가 없었습니다. 문제는 Lambda가 기본값을 지원하지 않는다는 것입니다(람다를 전달하기 때문에 사양에서는 모든 값을 제공한다고 가정합니다).

그래서 이것은 수정입니까? 나는 그것을 별도의 방법으로 나누는 혼란을 좋아하지 않습니다. 어떻게 고칠까요? nullable 값을 사용합시다.

app.MapGet("api/films", async (BechdelDataService ds, 
  int? page, 
  int? pageSize) =>
{
  if (ds is null) return Results.BadRequest();
  int pageNumber = page ?? 1;
  int pagerTake = pageSize ?? 50;

  FilmResult data = await ds.LoadAllFilmsAsync(pageNumber, pagerTake);
  if (data.Results is null) return Results.NotFound();

  return Results.Ok(data);


}).WithTags("By Film").Produces(200).ProducesProblem(404);



nullable 유형(int?)으로 값을 제공함으로써 자체적으로 기본값을 설정해야 하지만 허용 가능하다고 생각합니다. 여기서 한 가지 참고할 점은 데이터 서비스에 대한 호출을 더 쉽게 만들기 위해 유형을 null을 허용하지 않는 유형으로 정의하고 있지만 반드시 필요한 것은 아니라는 것입니다.

그렇다면 람다에서 기본값이 지원되지 않는다는 사실을 나만 몰랐던 것일까?



Shawn Wildermuth의 이 저작물은 Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License에 따라 라이선스가 부여되었습니다.
wildermuth.com의 작업을 기반으로 합니다.


이 기사가 마음에 들면 Pluralsight에서 Shawn의 과정을 참조하십시오.

좋은 웹페이지 즐겨찾기