У меня есть служба REST ASP.NET Web API (версия 4), где мне нужно передать массив целых чисел.
Вот мой метод действия:
public IEnumerable<Category> GetCategories(int[] categoryIds){
// code to retrieve categories from database
}
И это URL, который я пробовал:
/Categories?categoryids=1,2,3,4
c#
arrays
rest
asp.net-web-api
Хеманшу Бходжак
источник
источник
Ответы:
Вам просто нужно добавить
[FromUri]
перед параметром, выглядит так:И отправить запрос:
источник
Как указывает Филип W , вам, возможно, придется прибегнуть к пользовательскому подшивщику модели, подобному этому (модифицированному для привязки к фактическому типу параметра):
И тогда вы можете сказать:
/Categories?categoryids=1,2,3,4
и ASP.NET Web API будет правильно связывать вашcategoryIds
массив.источник
ModelBinderAttribute
поэтому его можно было использовать напрямую вместо трудоемкого синтаксиса с использованиемtypeof()
аргумента. Все , что вам нужно сделать , это унаследовать так:CommaDelimitedArrayModelBinder : ModelBinderAttribute, IModelBinder
а затем предоставить конструктор по умолчанию , который выталкивает определение типа до базового класса:public CommaDelimitedArrayModelBinder() : base(typeof(CommaDelimitedArrayModelBinder)) { }
.System.Collections.Generic.List<long>
какbindingContext.ModelType.GetElementType()
толькоSystem.Array
типы поддержкиЯ недавно столкнулся с этим требованием сам, и я решил внедрить,
ActionFilter
чтобы справиться с этим.Я применяю это так (обратите внимание, что я использовал 'id', а не 'ids', так как это указано в моем маршруте):
И публичный URL будет:
Возможно, вам придется рефакторинг это для удовлетворения ваших конкретных потребностей.
источник
В случае, если кому-то понадобится - добиться того же или похожего (например, удалить) с помощью
POST
вместоFromUri
, использоватьFromBody
и на стороне клиента (JS / jQuery) форматировать параметр как$.param({ '': categoryids }, true)
C #:
JQuery:
Дело в том,
$.param({ '': categoryids }, true)
что .net будет ожидать, что тело сообщения будет содержать значение в кодировке urlen, как=1&=2&=3
без имени параметра и без скобок.источник
code to retrieve categories from database
, что метод должен быть методом GET, а не POST.Простой способ отправить массив параметров в веб-API
API
Jquery: отправить объект JSON в качестве параметров запроса
Это сгенерирует ваш URL-адрес запроса, как
../api/categories/GetCategories?categoryIds=1&categoryIds=2&categoryIds=3&categoryIds=4
источник
Вы можете попробовать этот код, чтобы получить значения, разделенные запятыми / массив значений, чтобы получить JSON из webAPI
Вывод :
источник
Решение ASP.NET Core 2.0 (Swagger Ready)
вход
Код
Напишите провайдера (как MVC знает, какое связующее использовать)
Напишите фактическое связующее (получите доступ ко всей информации о запросе, действии, моделях, типах и т. Д.)
Зарегистрируйте его в MVC
Пример использования с хорошо документированным контроллером для Swagger
РЕДАКТИРОВАТЬ: Microsoft рекомендует использовать TypeConverter для этих детей операций по этому подходу. Поэтому следуйте советам, приведенным ниже, и документируйте свой тип с помощью SchemaFilter.
источник
Вместо использования пользовательского ModelBinder вы также можете использовать пользовательский тип с TypeConverter.
Преимущество состоит в том, что он делает параметры метода Web API очень простыми. Вам даже не нужно указывать [FromUri].
Этот пример для списка строк, но вы можете
categoryIds.Select(int.Parse)
вместо этого написать или просто написать IntList.источник
Первоначально я использовал решение, которое @Mrchief в течение многих лет (он прекрасно работает). Но когда я добавил Swagger в свой проект для документации API, моя конечная точка НЕ обнаруживалась.
Это заняло у меня некоторое время, но это то, что я придумал. Он работает с Swagger, и ваши сигнатуры методов API выглядят чище:
В конце концов вы можете сделать:
WebApiConfig.cs
Создайте новый класс: CommaDelimitedArrayParameterBinder.cs
Создайте новый класс: StringToIntArrayConverter.cs
Ноты:
источник
Применение:
Запросить URI
источник
/
в качестве сепаратора? Тогда вы можете иметь: dns / root / mystuff / path / to / some / resource, сопоставленный сpublic string GetMyStuff(params string[] pathBits)
Если вы хотите получить список / массив целых чисел, то самый простой способ сделать это - принять список строк, разделенных запятыми (,), и преобразовать его в список целых чисел. Не забудьте упомянуть [FromUri] attriubte.your url выглядит так:
источник
List<string>
вместо простоstring
? в нем будет только одна строка, которая есть1,2,3,289,56
в вашем примере. Я предложу изменить.List<Guid>
автоматически, хотя. Обратите внимание, в Asp.net Core аннотация есть[FromQuery]
, и она не нужна.Сделайте метод типа [HttpPost], создайте модель с одним параметром int [] и отправьте сообщение с помощью json:
источник
public IEnumerable<Category> GetCategories(int[] categoryIds){
- да, вы могли бы интерпретировать по-разному, я полагаю. Но часто я не хочу создавать классы-оболочки для создания оболочек. Если у вас есть сложные объекты, то это будет просто работать. Поддержка этих простых случаев - это то, что не работает "из коробки", следовательно, OP.POST
- на самом деле против парадигмы REST. Таким образом, такой API не был бы REST API.Или вы можете просто передать строку разделенных элементов и поместить ее в массив или список на принимающей стороне.
источник
Я решил эту проблему следующим образом.
Я использовал сообщение в API для отправки списка целых чисел в качестве данных.
Затем я вернул данные как бесчисленные.
Код отправки выглядит следующим образом:
Код получения выглядит следующим образом:
Это работает просто отлично для одной записи или нескольких записей. Заполнение является перегруженным методом, использующим DapperExtensions:
Это позволяет вам извлекать данные из составной таблицы (список идентификаторов), а затем возвращать записи, которые вас действительно интересуют, из целевой таблицы.
Вы можете сделать то же самое с представлением, но это дает вам немного больше контроля и гибкости.
Кроме того, детали того, что вы ищете из базы данных, не отображаются в строке запроса. Вам также не нужно конвертировать из CSV-файла.
При использовании любого инструмента, такого как интерфейс web api 2.x, следует помнить, что функции get, put, post, delete, head и т. Д. Имеют общее назначение, но не ограничиваются этим использованием.
Таким образом, хотя публикация обычно используется в контексте создания в интерфейсе веб-API, она не ограничивается этим использованием. Это обычный вызов html, который может использоваться для любых целей, разрешенных практикой html.
Кроме того, детали того, что происходит, скрыты от тех «любопытных глаз», которые мы так много слышим о наших днях.
Гибкость в соглашениях об именах в интерфейсе web api 2.x и использование обычных веб-вызовов означает, что вы отправляете вызов в web api, который вводит в заблуждение шумеров, заставляя их думать, что вы действительно делаете что-то еще. Например, вы можете использовать «POST» для реального извлечения данных.
источник
Я создал специальный механизм связывания, который преобразует любые значения, разделенные запятыми (только примитивные, десятичные, с плавающей точкой, строки), в соответствующие им массивы.
И как использовать в контроллере:
источник
Мое решение состояло в том, чтобы создать атрибут для проверки строк, он выполняет множество дополнительных общих функций, в том числе проверку регулярных выражений, которую можно использовать для проверки только чисел, а затем позже я конвертирую в целые числа при необходимости ...
Вот как вы используете:
источник