Как на самом деле работает FromQueryAttribute и зачем мне это нужно?

#c# #asp.net-mvc #asp.net-core #.net-core

#c# #asp.net-mvc #asp.net-core #.net-core

Вопрос:

Я работаю с некоторым уже существующим кодом, который использует конечную точку HttpGet для получения всех комментариев. Он принимает некоторые параметры по умолчанию, и перед каждым параметром он украшен [FromQuery] атрибутом. Я немного смущен тем, зачем нам это нужно здесь и что это действительно делает для меня.

В Интернете не так много всего, что я нашел, это документация: ( https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.fromqueryattribute?view=aspnetcore-2.2 )

Однако это не отвечает на мой вопрос…

  • Что такое строка запроса?
  • Как это используется в конечных точках?
  • Когда мне не нужно указывать этот атрибут? Я не вижу, чтобы он использовался очень часто.
 [HttpGet]
[ProducesResponseType(typeof(FooResponse), 200),
public async Task<ActionResult<FooResponse>> GetAll([FromQuery]string sortColumn = "CommentId",
    [FromQuery]SortDirections sortDirection = SortDirections.Asc, 
    [FromQuery]string filter = "", 
    [FromQuery]int page = 1, 
    [FromQuery]int pageSize = 10)
{
    var data = await _mediator.Send(new GetAllComments(sortColumn, sortDirection, filter, page, pageSize));
.
.
.
    return Ok(data);
}
  

Я подозреваю, что это как-то связано с тем, что передается в URL, но я не совсем уверен…

Комментарии:

1. Вы правы, это как-то связано с URL, если вы еще не знали, QueryString Parameters есть ли что-нибудь в URL, который идет после? за ними следует некоторая переменная = некоторое значение, так что что-то вроде этого, sometestsite.com?id=3 , id будет параметром строки запроса, украшая параметры вашего метода, он сообщает методу, что он должен быть включен в параметры строки запроса запроса.

Ответ №1:

Использование здесь излишне. Действие будет функционировать одинаково без [FromQuery] применения ко всем параметрам, поскольку оно отвечает только на запросы GET.

Что такое строка запроса?

Строка запроса — это часть URI после применения ? символа. Он представляет собой часть данных URI по сравнению с частью чистой маршрутизации.

Как это используется в конечных точках?

Вопрос здесь немного запутанный, поэтому было бы уместнее спросить «Как он используется в запросе?» Ответ на это — это способ передачи данных вместе с запросом GET в определенный URI. В отличие от других методов HTTP, GET на самом деле не разрешает «тело» запроса. (На самом деле, спецификация технически допускает это, но это почти повсеместно не реализовано таким образом.)

Когда мне не нужно указывать этот атрибут? Я не вижу, чтобы он использовался очень часто.

Опять же, лучший вопрос: «Когда мне действительно нужно указать этот атрибут?» Ответ на это в основном, когда неясно, откуда поступают данные. Это почти всегда будет с другими HTTP-методами, такими как POST. По умолчанию ожидается, что данные будут поступать из тела запроса, и в зависимости от типа содержимого этого тела запроса ожидается, что привязка будет либо FromForm , либо FromBody , что обычно используется по умолчанию для параметров там. (Значение по умолчанию зависит от того, имеете ли вы дело с традиционным контроллером в стиле MVC или контроллером в стиле API.) Если вам действительно нужно получить определенный параметр из строки запроса вместо тела в таком сценарии, тогда вы должны применить [FromQuery] атрибут к этому конкретному параметру.

Ответ №2:

Поскольку действие в вашем сообщении предназначено только для запросов GET ([HttpGet]), [FromQuery] не требуется — параметры автоматически будут использовать соответствующие значения строки запроса.

Для действий POST ([HttpPost]) этот атрибут указывает на получение значения из строки запроса в отличие от данных, которые были опубликованы.

Ответ №3:

Строка запроса — это часть URL, которая идет после ? и предоставляет способ передачи значений в виде списка пар ключ-значение, каждая пара разделена amp; символами. Допустим, у вас есть следующий URL:

http://mywebsite.com/somePage?a=123amp;b=Helloamp;c=World

Итак, часть строки запроса int, которой соответствует URL a=123amp;b=Helloamp;c=World , и список переданных пар ключ-значение были:

 a = 123
b = Hello
c = World
  

ASP.NET Ядро может привязывать значения к переменным множеством разных способов, и один из них — считывать значения из строки запроса и преобразовывать / присваивать эти значения значениям методов вашего API. Чтобы указать, что параметр должен поступать из строки запроса, вы используете атрибут [FromQuery].

Итак, например, когда у вас есть, [FromQuery]string sortColumn = "CommentId" вы в основном говорите ему, чтобы он прочитал sortColumn ключ из строки запроса и присвоил его sortColumn параметру GetAll() метода, и если этот ключ «sortColumn» отсутствует в строке запроса, ему следует присвоить значение «commentId» по умолчанию. Это похоже на другие параметры.

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

http://your-system-url-here/GetAll?page=2amp;pageSize=20

Который бы определял page параметр значением 2 , а pageSize параметр размером 20 .