최소 API에서 쿼리 문자열에 액세스하는 방법
그래서 저는 다음과 같이 모든 영화를 얻기 위한 최소한의 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의 과정을 참조하십시오.
Reference
이 문제에 관하여(최소 API에서 쿼리 문자열에 액세스하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/shawnwildermuth/how-to-access-query-strings-in-minimal-apis-33a1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)