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

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

Для получения всей информации о запросе в компонентах middleware используется свойство 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. Например, получим все заголовки запроса и выведем их на веб-страницу:

Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http
Module Program
    Sub Main(args As String())

        Dim builder = WebApplication.CreateBuilder(args)
        Dim app = builder.Build()

        app.Run(Async Function(context As HttpContext) As Task
                    context.Response.ContentType = "text/html; charset=utf-8"
                    Dim stringBuilder = New Text.StringBuilder("<table>")

                    For Each header In context.Request.Headers
                        stringBuilder.Append($"<tr><td>{header.Key}</td><td>{header.Value}</td></tr>")
                    Next

                    stringBuilder.Append("</table>")
                    Await context.Response.WriteAsync(stringBuilder.ToString())
                End Function)
        app.Run()
    End Sub
End Module
Получение заголовков запроса в ASP.NET Core и Visual Basic .NET

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

Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http
Module Program
    Sub Main(args As String())

        Dim builder = WebApplication.CreateBuilder(args)
        Dim app = builder.Build()

        app.Run(Async Function(context As HttpContext) As Task

                    Dim acceptHeaderValue = context.Request.Headers.Accept
                    Await context.Response.WriteAsync($"Accept: {acceptHeaderValue}")

                End Function)
        app.Run()
    End Sub
End Module

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

Dim acceptHeaderValue = context.Request.Headers("accept")

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

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

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

Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http
Module Program
    Sub Main(args As String())

        Dim builder = WebApplication.CreateBuilder(args)
        Dim app = builder.Build()

        app.Run(Async Function(context As HttpContext) As Task
                    Await context.Response.WriteAsync($"Path: {context.Request.Path}")
                End Function)
        app.Run()
    End Sub
End Module
получение пути запроса в ASP.NET Core и Visual Basic .NET

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

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

Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http
Module Program
    Sub Main(args As String())

        Dim builder = WebApplication.CreateBuilder(args)
        Dim app = builder.Build()

        app.Run(Async Function(context As HttpContext) As Task
                    Dim path = context.Request.Path.Value
                    Dim response = context.Response

                    If path = "/date" Then
                        Await response.WriteAsync($"Date: {Now.ToShortDateString()}")
                    ElseIf path = "/time" Then
                        Await response.WriteAsync($"Time: {Now.ToShortTimeString()}")
                    Else
                        Await response.WriteAsync("Hello METANIT.COM")
                    End If
                End Function)
        app.Run()
    End Sub
End Module

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

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

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

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

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

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

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

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

Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http
Module Program
    Sub Main(args As String())

        Dim builder = WebApplication.CreateBuilder(args)
        Dim app = builder.Build()

        app.Run(Async Function(context As HttpContext) As Task

                    context.Response.ContentType = "text/html; charset=utf-8"
                    Await context.Response.WriteAsync($"<p>Path: {context.Request.Path}</p>" +
                                $"<p>QueryString: {context.Request.QueryString}</p>")
                End Function)
        app.Run()
    End Sub
End Module
получение строки запроса в ASP.NET Core и Visual Basic .NET

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

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

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

/users

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

?name=Tom&age=37

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

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

Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http
Module Program
    Sub Main(args As String())

        Dim builder = WebApplication.CreateBuilder(args)
        Dim app = builder.Build()

        app.Run(Async Function(context As HttpContext) As Task

                    context.Response.ContentType = "text/html; charset=utf-8"
                    Dim stringBuilder = New Text.StringBuilder("<h3>Параметры строки запроса</h3><table>")
                    stringBuilder.Append("<tr><td>Параметр</td><td>Значение</td></tr>")
                    For Each param In context.Request.Query
                        stringBuilder.Append($"<tr><td>{param.Key}</td><td>{param.Value}</td></tr>")
                    Next
                    stringBuilder.Append("</table>")
                    Await context.Response.WriteAsync(stringBuilder.ToString())
                End Function)
        app.Run()
    End Sub
End Module
парсинг строки запроса в ASP.NET Core и Visual Basic .NET

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

Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Http
Module Program
    Sub Main(args As String())

        Dim builder = WebApplication.CreateBuilder(args)
        Dim app = builder.Build()

        app.Run(Async Function(context As HttpContext) As Task

                    Dim name = context.Request.Query("name")
                    Dim age = context.Request.Query("age")
                    Await context.Response.WriteAsync($"{name} - {age}")
                End Function)
        app.Run()
    End Sub
End Module
параметры строки запроса в ASP.NET Core и Visual Basic .NET
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850