HttpRequest. Получение данных запроса

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

Свойство Request объекта HttpContext представляет объект HttpRequest и хранит информацию о запросе в виде следующих свойств:

  • Body: предоставляет тело запроса в виде объекта Stream

  • BodyReader: возвращает объект типа PipeReader для чтения тела запроса

  • ContentLength: получает или устанавливает заголовок Content-Length

  • ContentType: получает или устанавливает заголовок Content-Type

  • Cookies: возвращает коллекцию куки (объект Cookies), ассоциированных с данным запросом

  • Form: получает или устанавливает тело запроса в виде форм

  • HasFormContentType: проверяет наличие заголовка Content-Type

  • Headers: возвращает заголовки запроса

  • Host: получает или устанавливает заголовок Host

  • HttpContext: возвращает связанный с данным запросом объект HttpContext

  • IsHttps: возвращает true, если применяется протокол https

  • Method: получает или устанавливает метод HTTP

  • Path: получает или устанавливает путь запроса в виде объекта RequestPath

  • PathBase: получает или устанавливает базовый путь запроса. Такой путь не должен содержать завершающий слеш

  • Protocol: получает или устанавливает протокол, например, HTTP

  • Query: возвращает коллекцию параметров из строки запроса

  • QueryString: получает или устанавливает строку запроса

  • RouteValues: получает данные маршрута для текущего запроса

  • Scheme: получает или устанавливает схему запроса HTTP

Рассмотрим применение некоторых из этих свойств.

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

Для получения заголовков применяется свойство Headers, которое представляет тип IHeaderDictionary. Например, получим все заголовки запроса и выведем их на веб-страницу:

var builder = WebApplication.CreateBuilder();
var app = builder.Build();

app.Run(async(context) =>
{
    context.Response.ContentType = "text/html; charset=utf-8";
    var stringBuilder = new System.Text.StringBuilder("<table>");
    
    foreach(var header in context.Request.Headers)
    {
        stringBuilder.Append($"<tr><td>{header.Key}</td><td>{header.Value}</td></tr>");
    }
    stringBuilder.Append("</table>");
    await context.Response.WriteAsync(stringBuilder.ToString());
});

app.Run();
Получение заголовков запроса в ASP.NET Core и C#

Для большинства стандартных заголовков HTTP в этом интерфейсе определены одноименные свойства, например, для заголовка "content-type" определено свойство ContentType, а для заголовка "accept" - свойство Accept:

var builder = WebApplication.CreateBuilder();
var app = builder.Build();

app.Run(async(context) =>
{
    var acceptHeaderValue = context.Request.Headers.Accept;
    await context.Response.WriteAsync($"Accept: {acceptHeaderValue}");
});

app.Run();

Также подобые заголовки, а также какие-то кастомные заголовки, для которых не определены подобные свойства, можно получить как и любой дугой элемент словаря:

var acceptHeaderValue = context.Request.Headers["accept"];

Для ряда заголовков в классе HttpRequest определены отдельные свойства: Host, Method, ContentType, ContentLength.

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

Свойство path позволяет получить запрошенный путь, то есть адрес, к которому обращается клиент:

var builder = WebApplication.CreateBuilder();
var app = builder.Build();

app.Run(async(context) => await context.Response.WriteAsync($"Path: {context.Request.Path}"));

app.Run();
получение пути запроса в ASP.NET Core и C#

Это свойство позволяет нам узнать, по какому адресу обращается пользователю. Например, мы можем определить условную обработку запроса в зависимости от запрошенного адреса:

Свойство path позволяет получить запрошенный путь, то есть адрес, к которому обращается клиент:

var builder = WebApplication.CreateBuilder();
var app = builder.Build();

app.Run(async(context) => 
{
    var path = context.Request.Path;
    var now = DateTime.Now;
    var response = context.Response;

    if (path=="/date")
        await response.WriteAsync($"Date: {now.ToShortDateString()}");
    else if (path == "/time")
        await response.WriteAsync($"Time: {now.ToShortTimeString()}");
    else
        await response.WriteAsync("Hello METANIT.COM");
});

app.Run();

В данном случае, если пользователь обращается по адресу "/date", то ему отображается текущая дата, а если обращается по адресу "/time" - текущее время. В остальных случаях отображается некоторое универсальное сообщение:

получение адреса запроса и маршрутизация в ASP.NET Core и C#

Подобным образом можно определить свою систему маршрутизации, однако в ASP.NET Core по умолчанию есть инструменты, которые проще использовать для создания системы маршрутизации в приложении и которые будут рассмотрены в последующих статьях.

Строка запроса

Свойство QueryString позволяет получить строку запроса. Строка запроса представляет ту часть запрошенного адреса, которая идет после символа ? и представляет набор параметров, разделенных символом амперсанда &:

?параметр1=значение1&параметр2=значение2&параметр3=значение3

Каждому параметру с помощью знака равно передается некоторое значение.

Стоит отметить, что строка запроса (query string) НЕ входит в путь запроса (path):

var builder = WebApplication.CreateBuilder();
var app = builder.Build();

app.Run(async(context) => 
{
    context.Response.ContentType = "text/html; charset=utf-8";
    await context.Response.WriteAsync($"<p>Path: {context.Request.Path}</p>" +
        $"<p>QueryString: {context.Request.QueryString}</p>");
});

app.Run();
получение строки запроса в ASP.NET Core и C#

Так, в данном случае идет обращение по адресу

https://localhost:7256/users?name=Tom&age=37

Путь запроса или path представляет ту часть адреса, которая идет после домена/порта и до символа ?.

/users

Строка запроса или query string представляет ту часть адреса, которая идет начиная с символа ?.

?name=Tom&age=37

То есть в данном случае через строку запроса передаются два параметра. Первый параметр - name имеет значение "Tom". Bторой параметр - age имеет значение 37.

С помощью свойства Query можно получить все параметры строки запроса в виде словаря:

var builder = WebApplication.CreateBuilder();
var app = builder.Build();

app.Run(async(context) => 
{
    context.Response.ContentType = "text/html; charset=utf-8";
    var stringBuilder = new System.Text.StringBuilder("<h3>Параметры строки запроса</h3><table>");
    stringBuilder.Append("<tr><td>Параметр</td><td>Значение</td></tr>");
    foreach (var param in context.Request.Query)
    {
        stringBuilder.Append($"<tr><td>{param.Key}</td><td>{param.Value}</td></tr>");
    }
    stringBuilder.Append("</table>");
    await context.Response.WriteAsync(stringBuilder.ToString());
});

app.Run();
парсинг строки запроса в ASP.NET Core и C#

Соответственно можно вытащить из словаря Query значения отдельных параметров:

var builder = WebApplication.CreateBuilder();
var app = builder.Build();

app.Run(async(context) =>
{
    string name = context.Request.Query["name"];
    string age = context.Request.Query["age"];
    await context.Response.WriteAsync($"{name} - {age}");
});

app.Run();
параметры строки запроса в ASP.NET Core и C#
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850