Как на самом деле работает FromQueryAttribute и зачем он мне нужен? - PullRequest
0 голосов
/ 03 апреля 2019

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

В Интернете не так много всего, что я нашел, это документация: (https://docs.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, но я не совсем уверен ...

Ответы [ 3 ]

1 голос
/ 03 апреля 2019

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

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

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

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

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

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

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

1 голос
/ 03 апреля 2019

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

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

0 голосов
/ 03 апреля 2019

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

http://mywebsite.com/somePage?a=123&b=Hello&c=World

Таким образом, часть строки запроса int с этим URL соответствует a=123&b=Hello&c=World, а список пар ключ-значение, которые были переданы, был:

a = 123
b = Hello
c = World

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

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

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

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

Что даст параметру page значение 2, а параметру pageSize - 20.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...