powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Передача объекта параметров в Get-запросе
25 сообщений из 71, страница 1 из 3
Передача объекта параметров в Get-запросе
    #39870527
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, у меня есть ASP Core 3.0 контроллер с методом который принимает сложный фильтр в качестве параметра.
Код: c#
1.
2.
3.
4.
5.
6.
7.
        [Produces("application/json")]
        [HttpGet]
 
        public async   Task<IActionResult> GetMarksAsync(
         [FromQuery] GetMarksAsyncParamsModel getMarksAsyncParamsModel)
        {        
        }


В качестве параметров для данного метода мне нужно переда 2 DateTime и 2 целочисленных массива.
Поэтому пришлось перейти на [FromQuery] и соответственно создать обертку
Код: c#
1.
2.
3.
4.
5.
6.
7.
 public class GetMarksAsyncParamsModel
    {
        public DateTime startDate { get; set; }
        public DateTime finalDate { get; set; }
        public int[] companiesfilter { get; set; }
        public int[] personfilter { get; set; }
    }



Из Vue-js приложения с помощью axios делаю get-запрос

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
      let companyFiltersrc = [1, 2, 3];
      let personFiltersrc = [1, 2, 3];

   const queryParams = {
        startDate: this.dateTimeRange[0],
        finalDate: this.dateTimeRange[1],
        companiesfilter: companyFiltersrc,
        personfilter: personFiltersrc
      };

 await HTTP.get("EntryMark/GetMarks", { params: queryParams })



В метод контроллера приходит getMarksAsyncParamsModel, у которой есть значения только у startDate и finalDate, массивы пустые.
Пробовал вместо массивов использовать Ienumerable<int>, тогда приходит null.
Строка запроса получается следующая:

http://localhost:5000/EntryMark/GetMarks?startDate=2019-10-01T21:00:00.000Z&finalDate=2019-10-02T21:00:00.000Z&companiesfilter []=1&personfilter[]=12940&personfilter[]=7725&personfilter[]=705&personfilter[]=3974
Знаю, что можно сделать POST-запрос и тогда все заработает, но все же хотелось чтобы использовался именно GET, чтобы не противоречить семантике методов HTTP. Спасибо
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39870533
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По идее, никаких квадратных скобок в запросе быть не должно, то есть так
Код: c#
1.
personfilter=12940&personfilter=7725&personfilter=705

тогда FromQuery должен отработать нормально
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39870547
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
действительно параметр терялся из за [], осталось только понять почему axios пририсовывает квадратные скобки к array-параметрам.
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39870567
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант, если совсем сложные запросы, то можно делать в два прохода: передаем запрос на сервер через POST, сохраняем его где-нибудь на сервере (в БД, напр.) с ключом, возвращаем ключ клиенту, затем клиент делает уже GET запрос с этим ключом в качестве параметра.
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39870579
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat,
так можно и в один проход сразу из POST-запроса вернуть всё.
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39870633
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получилось решить проблему следующим образом:
импортирую npm qs
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
      const queryParams = {
        startDate: this.dateTimeRange[0],
        finalDate: this.dateTimeRange[1],
        companiesfilter: companyFiltersrc,
        personfilter: personFiltersrc
      };

      const queryString = qs.stringify(queryParams, {
        arrayFormat: "repeat"
      });

      await HTTP.get("EntryMark/GetMarks/?" + queryString, {
        params: queryParams
      })
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39870902
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_subfkthat,
так можно и в один проход сразу из POST-запроса вернуть всё.

Это некошерно. Возврат результатов поиска должен быть через GET. Это такой бест практис - запрос чего-то не изменяющий состояние сервера должен быть GET, а изменения на сервере это POST/PUT/DELETE.
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39871628
Агнец за бортом
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatvb_subfkthat,
так можно и в один проход сразу из POST-запроса вернуть всё.

Это некошерно. Возврат результатов поиска должен быть через GET. Это такой бест практис - запрос чего-то не изменяющий состояние сервера должен быть GET, а изменения на сервере это POST/PUT/DELETE.


Что за ерунда? Ты мешаешь бизнес-логику (поиск) с транспортной (GET/POST). Сложные объекты передаются через POST - что тут некошерного?

" то можно делать в два прохода:" - когда коту делать нечего...

fkthatзапрос чего-то не изменяющий состояние сервера должен быть GET,

Протоколы посерьезней пацанов со скуля кладут на это.
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39871683
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatЭто некошерно. Возврат результатов поиска должен быть через GET. Это такой бест практис - запрос чего-то не изменяющий состояние сервера должен быть GET, а изменения на сервере это POST/PUT/DELETE.

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

Кошерность тут не при чём, дас ист реальность )
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39871692
carrotik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.. на другом форуме мне сказали, что POST для получения данных (не для создания сущности на сервере) мешает использовать кнопку "назад" в браузере (ну, то есть, не сохраняется история браузера) ... это просто комментарий, не в качестве аргумента за или против ... сам я POST-ирую из SPA на Vue.js по всем случаям ...
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39871694
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
carrotik.. на другом форуме мне сказали, что POST для получения данных (не для создания сущности на сервере) мешает использовать кнопку "назад" в браузере

я имел в виду про API.

с точки зрения браузера всё несколько иначе, да и семантика другая.
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39871696
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
carrotik.. на другом форуме мне сказали, что POST для получения данных (не для создания сущности на сервере) мешает использовать кнопку "назад" в браузере (ну, то есть, не сохраняется история браузера) ... это просто комментарий, не в качестве аргумента за или против ... сам я POST-ирую из SPA на Vue.js по всем случаям ...в данном случае ни GET ни POST не повлияют на историю браузера - тут же нет перехода на другую страницу.
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39871766
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttТо, что GET должен быть идемпотентным -- да, однозначно
POST может использоваться как GET в случаях, когда запрос представляет собой сложный объект, и чисто технически GET использовать невозможно.

Кошерность тут не при чём, дас ист реальность )

Не, ну, конечно, в иной ситуации не то что некошерное съешь, но и свинины ломоть заточишь. Но, делая поиск через пост мы, например, теряем возможность "вперед-назад", или возможность сохранить результаты поиска в закладках и т.п. Ну и плюс POST с отображением его результата это сам по себе трефной подход, т.к. кошером считается паттерн "Post/Redirect/Get"
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39871770
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatНе, ну, конечно, в иной ситуации не то что некошерное съешь, но и свинины ломоть заточишь. Но, делая поиск через пост мы, например, теряем возможность "вперед-назад", или возможность сохранить результаты поиска в закладках и т.п. Ну и плюс POST с отображением его результата это сам по себе трефной подход, т.к. кошером считается паттерн "Post/Redirect/Get"

вперёд-назад не теряем, если это SPA :)

но вот прям упарываться и пытаться сделать GET не нужно, как этого хочет ТС
P/R/G конечно известный паттерн, но он немного про другое, его задача решать проблему повторной отправки формы, в том числе по F5
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39871780
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Агнец за бортомЧто за ерунда? Ты мешаешь бизнес-логику (поиск) с транспортной (GET/POST).

Нихера не понял. Не изволите ли изъясниться яснее?

Агнец за бортом" то можно делать в два прохода:" - когда коту делать нечего...

Post/Redirect/Get. Ссылку уже давал. Тоже придумали когда делать нечего?

Агнец за бортомПротоколы посерьезней пацанов со скуля кладут на это.

Это SOAP, что ли? "Творение Комитета" , которое все уже забыли аки ночной кошмар
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39871792
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttвперёд-назад не теряем, если это SPA :)

Ну, где SPA, там и REST, а с т.з. REST поиск через POST это уже вообще по ту сторону зла :)

hVosttP/R/G конечно известный паттерн, но он немного про другое, его задача решать проблему повторной отправки формы, в том числе по F5

При поиске с этим тоже будет проблема. По Ф5 страшного ничего не случится, но будет анноящее предупреждение о повторной отправке. "Убивать тебя не станут, но тоже ничего хорошего" (с)
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39871833
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthathVosttвперёд-назад не теряем, если это SPA :)

Ну, где SPA, там и REST, а с т.з. REST поиск через POST это уже вообще по ту сторону зла :)

нет там никакого зла. в пост можно отправить нормальный объект запроса, с фильтрами, группировками, сортировками и другими параметрами.

чистота GET это про уникальный адрес ресурса и обращение к ресурсу.
параметры запроса в query string уже пинают этой концепции по яйцам.

так что пофигу что у вас там будет для получения данных: GET или POST.
абсолютно монопенисуально :)


fkthatПри поиске с этим тоже будет проблема. По Ф5 страшного ничего не случится, но будет анноящее предупреждение о повторной отправке. "Убивать тебя не станут, но тоже ничего хорошего" (с)


веб не идеален )
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39871862
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttчистота GET это про уникальный адрес ресурса и обращение к ресурсу.
параметры запроса в query string уже пинают этой концепции по яйцам.

Почему же. Очень даже по REST. Есть ресурс (path часть URL, то что до "?"). У ресурса может быть множество разных представлений. А query string - это как раз опции представления этого одного и того же ресурса.

Разжую пример с поиском. Запрос на поиск мы трактуем как ресурс. Есть коллекция этих ресурсов с URL, допустим, "/api/search", отдельный ресурс запроса поиска будет иметь URL "/api/search/{id}". Ресурс поиска имеет два представления (representation) - параметры поиска, например в JSON и список с результатами поиска. Теперь клиент отправляет POST на /api/search передавая параметры поиска (первое представление), а POST по URL коллекции это как раз создание ресурса. Сервер сохраняет этот ресурс (запрос) в каком-нибудь storage, клиенту возвращается ID созданного ресурса. Допустим "4269". Теперь клиент делает запрос GET по URL этого ресурса /api/search/4269 и в ответ получает второе представление этого ресурса (список с результатами поиска). Все как раз предельно по REST.

hVosttвеб не идеален )

Да мир вообще не идеален. Порой по необходимости такого наговнокодишь, что в страшном сне не привидится. Но в данном случае речь ведь не идет о выборе "сделать трефно, но зато за один день или делать кошерно, но целый год". Я сам такую шляпу однажды делал, и если уже есть вся логика самого поиска, то дел тут от силы на пару-тройку человекочасов.
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39871973
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatvb_subfkthat,
так можно и в один проход сразу из POST-запроса вернуть всё.

Это некошерно. Возврат результатов поиска должен быть через GET. Это такой бест практис - запрос чего-то не изменяющий состояние сервера должен быть GET, а изменения на сервере это POST/PUT/DELETE.
GraphQL ещё не видели? :)
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39871986
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий МухGraphQL ещё не видели? :)

Не. Еще не интересовался. Это что-то типа RIPнутого OData?
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39871989
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух,

Взглянул мельком - показалось, что какая-то шляпа. Чо уж тогда до конца не идти, и не разрешить передачу sql запроса прямо в http. Кстати, в MS SQL такая тема была еще лет 10 назад, потом потом, видать таки поняли, что за херь на самом деле придумали, и фичу эту нах выпилили.
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39872036
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatПочему же. Очень даже по REST. Есть ресурс (path часть URL, то что до "?"). У ресурса может быть множество разных представлений. А query string - это как раз опции представления этого одного и того же ресурса.

У query string есть ряд ограничений. На длину строки в первую очередь, во вторую на передачу структуры, а не плоский набор параметров -- придётся извращаться. В третью, ограниченный набор символов, придётся эскейпить, что сильно влияет на длину строки.

В итоге, я не понимаю, чего ради еб****ь, чтобы влезть в ограничения, если можно использовать POST и передавать нормальные структуры данных с поддержкой UTF-8.


fkthatРазжую пример с поиском. Запрос на поиск мы трактуем как ресурс. Есть коллекция этих ресурсов с URL, допустим, "/api/search", отдельный ресурс запроса поиска будет иметь URL "/api/search/{id}". Ресурс поиска имеет два представления (representation) - параметры поиска, например в JSON и список с результатами поиска. Теперь клиент отправляет POST на /api/search передавая параметры поиска (первое представление), а POST по URL коллекции это как раз создание ресурса. Сервер сохраняет этот ресурс (запрос) в каком-нибудь storage, клиенту возвращается ID созданного ресурса. Допустим "4269". Теперь клиент делает запрос GET по URL этого ресурса /api/search/4269 и в ответ получает второе представление этого ресурса (список с результатами поиска). Все как раз предельно по REST.

REST не накладывает ограничения на использование POST для read-only получения данных.
Видимо вы никогда не имели никаких дел со сложной клиентской фильтрацией, поэтому у вас рассуждения ограничиваются исключительно придуманной себе REST-религией и собственным опытом.

Как заметил Дмитрий выше, хороший пример GraphQL, в котором запрос к данным это сложный объект, который передаётся в JSON.


fkthatДа мир вообще не идеален. Порой по необходимости такого наговнокодишь, что в страшном сне не привидится. Но в данном случае речь ведь не идет о выборе "сделать трефно, но зато за один день или делать кошерно, но целый год". Я сам такую шляпу однажды делал, и если уже есть вся логика самого поиска, то дел тут от силы на пару-тройку человекочасов.

Никаких минусов в использовании POST для запроса данных нет. Кроме упорото религиозных конечно.
И никто не говорил, что семантика это плохо. Нет, но нужно смотреть на мир не через розовые очки, и понимать, что нужно решать задачи, а не обтёсывать кирпичики до идеально ровных граней.
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39872044
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatДмитрий МухGraphQL ещё не видели? :)

Не. Еще не интересовался. Это что-то типа RIPнутого OData?нет
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39872045
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatВзглянул мельком - показалось, что какая-то шляпа. Чо уж тогда до конца не идти, и не разрешить передачу sql запроса прямо в http. Кстати, в MS SQL такая тема была еще лет 10 назад, потом потом, видать таки поняли, что за херь на самом деле придумали, и фичу эту нах выпилили.

Ну и зачем выдумывать всякую ересь? Ничего никто не выпиливал, откуда такие больные фантазии берутся-то?

https://www.nuget.org/packages/Microsoft.AspNetCore.OData
...
Рейтинг: 0 / 0
Передача объекта параметров в Get-запросе
    #39872046
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatВзглянул мельком - показалось, что какая-то шляпа.однако популярная шляпа, набирающая оброты


советую подробнее ознакомиться, чем попусту спорить на форуме
...
Рейтинг: 0 / 0
25 сообщений из 71, страница 1 из 3
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Передача объекта параметров в Get-запросе
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]