Одной из форм передачи данных приложению на ASP.NET представляет передача строки запроса, то есть ту часть адреса URL, которая идет после символа ? (вопросительного знака). Например:
https://localhost:7206/user?name=Tom&age=39
В данном случае часть ?name=Tom&age=39
представляет строку запроса.
Строка запроса состоит из параметров в виде
?параметр1&параметр2&параметрN
Каждый параметр отделяется от другого с помощью символа амперсанда & и определяется в следующем виде:
имя_параметра=значение_параметра
После имени параметра через символ равно указывается значение параметра. Например, в строке запроса из следующего адреса:
https://localhost:7206/user?name=Tom&age=39
определены два параметры. Первый параметр назвается "name" и имеет значение "Tom", а второй параметр называется "age" и имеет значение 39.
Для получения параметров строки запроса в конечной точке ASP.NET Core надо определить обработчик, параметры которого соответствуют названиям параметров. Например, возьмем следующее приложение:
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.MapGet("/user", (string name, int age) => $"Name: {name} Age: {age}"); app.MapGet("/", () => "Hello METANIT.COM"); app.Run();
Здесь для первой конечной точки, которая обрабатывает запросы по адресу "/user", определен обработчик, который принимает два параметра - name и age.
Значения этих параметров приложение будет брать из строки запроса. Например, если мы обратимся с запросом /user?name=Tom&age=39
, то строка "Tom"
перейдет в параметр name, а число 39 - в параметр age:
Стоит отметить, что между параметрами в приложении ASP.NET и значениями параметров строки запроса должно быть соответствие по типу данных. Так, в примере
выше параметр age представляет тип int
, соответственно ему надо передать целочисленное значение. Иначе ASP.NET не сможет связать значение с параметром age.
В примере выше оба параметра являются обязательными, нам обязательно надо передать для них значения. Если мы хотим сделать параметр необязательным, то в качестве типа можно использовать соответствующий nullable-тип:
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.MapGet("/user", (string name, int? age) => $"Name: {name} Age: {age??0}"); app.MapGet("/", () => "Hello METANIT.COM"); app.Run();
Здесь параметр age является необязательным и, если он не указан, например, в запросе /user?name=Sam
, то параметр получает значение null.
Стоит отметить, что одна конечная точка может сочетать одноименные параметры маршрута и строки запроса, в этом случае параметры маршрута будут иметь приоритет:
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.MapGet("/user/{name}", (string name, int age) => $"Name: {name} Age: {age}"); app.MapGet("/", () => "Hello METANIT.COM"); app.Run();
Здесь, для первой конечной точки определен параметр маршрута name. И даже если мы передадим параметр строки запроса, который называется name, то обработчик конченой точки все равно получит данные именно из параметра маршрута:
Если параметров строки запроса несколько, то с ними менее удобно работать, и, возможно, мы захотим объединить их в какой-нибудь общий тип данных, наподобие следующего:
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.MapGet("/user", (Person person) => $"Name: {person.Name} Age: {person.Age}"); app.MapGet("/", () => "Hello METANIT.COM"); app.Run(); record Person(string Name, int Age);
Здесь два параметра name и age объединены в один тип Person, и мы ожидаем, что при передаче строки запроса с параметрами name и age среда ASP.NET сможет связать их со свойствами объекта Person. Однако этот способ не работает, поскольку по умолчанию ASP.NET Core будет искать значения для объектов непримитивных типов в теле запроса, а не в строке запроса. Соответственно при выполнении мы получим ошибку. Чтобы явным образом указать, что данные будут браться из строки запроса, надо использовать атрибут [AsParameters]:
app.MapGet("/user", ([AsParameters] Person person) => $"Name: {person.Name} Age: {person.Age}");