Получение параметров строки запроса

Последнее обновление: 06.09.2023

Одной из форм передачи данных приложению на 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 Core и C#

Стоит отметить, что между параметрами в приложении 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, то обработчик конченой точки все равно получит данные именно из параметра маршрута:

Сочетание параметров строки запроса и параметров маршрутов в ASP.NET Core и C#

Объединение параметров

Если параметров строки запроса несколько, то с ними менее удобно работать, и, возможно, мы захотим объединить их в какой-нибудь общий тип данных, наподобие следующего:

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}");
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850