Tengo un servicio REST ASP.NET Web API (versión 4) donde necesito pasar una matriz de enteros.
Aquí está mi método de acción:
public IEnumerable<Category> GetCategories(int[] categoryIds){
// code to retrieve categories from database
}
Y esta es la URL que he probado:
/Categories?categoryids=1,2,3,4
c#
arrays
rest
asp.net-web-api
Hemanshu Bhojak
fuente
fuente
Respuestas:
Solo necesita agregar
[FromUri]
antes del parámetro, se ve así:Y enviar solicitud:
fuente
Como señala Filip W , es posible que deba recurrir a un modelo de carpeta personalizado como este (modificado para unirse al tipo real de parámetro):
Y luego puedes decir:
/Categories?categoryids=1,2,3,4
y la API web ASP.NET enlazará correctamente sucategoryIds
matriz.fuente
ModelBinderAttribute
para que pueda usarse directamente en lugar de la sintaxis laboriosa que usa eltypeof()
argumento. Todo lo que tiene que hacer es heredan de este modo:CommaDelimitedArrayModelBinder : ModelBinderAttribute, IModelBinder
y entonces proporcionarle un constructor por defecto que empuja hacia abajo la definición del tipo de la clase base:public CommaDelimitedArrayModelBinder() : base(typeof(CommaDelimitedArrayModelBinder)) { }
.System.Collections.Generic.List<long>
comobindingContext.ModelType.GetElementType()
soloSystem.Array
tipos de soporteRecientemente me encontré con este requisito, y decidí implementar un
ActionFilter
para manejar esto.Lo estoy aplicando así (tenga en cuenta que usé 'id', no 'ids', ya que así es como se especifica en mi ruta):
Y la url pública sería:
Puede que tenga que refactorizar esto para satisfacer sus necesidades específicas.
fuente
En caso de que alguien necesite, para lograr lo mismo o algo similar (como eliminar) a través
POST
deFromUri
, en lugar de , useFromBody
y en el lado del cliente (JS / jQuery) el parámetro de formato como$.param({ '': categoryids }, true)
C#:
jQuery:
La
$.param({ '': categoryids }, true)
cuestión es que .net esperará que el cuerpo de la publicación contenga un valor codificado como=1&=2&=3
sin nombre de parámetro y sin corchetes.fuente
code to retrieve categories from database
, por lo tanto, el método debe ser un método GET, no POST.Manera fácil de enviar parámetros de matriz a la API web
API
Jquery: enviar objeto JSON como parámetros de solicitud
Generará su URL de solicitud como
../api/categories/GetCategories?categoryIds=1&categoryIds=2&categoryIds=3&categoryIds=4
fuente
Puede probar este código para tomar valores separados por comas / una matriz de valores para recuperar un JSON de webAPI
Salida:
fuente
Solución ASP.NET Core 2.0 (Listo para Swagger)
Entrada
Código
Escriba al proveedor (cómo MVC sabe qué carpeta usar)
Escriba el cuaderno real (acceda a todo tipo de información sobre la solicitud, acción, modelos, tipos, lo que sea)
Regístralo con MVC
Ejemplo de uso con un controlador bien documentado para Swagger
EDITAR: Microsoft recomienda usar un TypeConverter para estos niños de operaciones sobre este enfoque. Por lo tanto, siga los siguientes consejos de carteles y documente su tipo personalizado con un SchemaFilter.
fuente
En lugar de usar un ModelBinder personalizado, también puede usar un tipo personalizado con un TypeConverter.
La ventaja es que hace que los parámetros del método de API web sean muy simples. Ni siquiera necesita especificar [FromUri].
Este ejemplo es para una Lista de cadenas, pero podría hacer
categoryIds.Select(int.Parse)
o simplemente escribir una IntList en su lugar.fuente
Originalmente usé la solución que @Mrchief durante años (funciona muy bien). Pero cuando agregué Swagger a mi proyecto para la documentación de la API, mi punto final NO aparecía.
Me tomó un tiempo, pero esto es lo que se me ocurrió. Funciona con Swagger, y sus firmas de método API se ven más limpias:
Al final puedes hacer:
WebApiConfig.cs
Cree una nueva clase: CommaDelimitedArrayParameterBinder.cs
Cree una nueva clase: StringToIntArrayConverter.cs
Notas:
fuente
Uso:
Solicitar uri
fuente
/
Funcionará con el separador? Entonces podría tener: dns / root / mystuff / path / to / some / resource mapeado enpublic string GetMyStuff(params string[] pathBits)
Si desea hacer una lista / matriz de enteros, la forma más fácil de hacerlo es aceptar la lista de cadenas separada por comas (,) y convertirla en una lista de enteros. No se olvide de mencionar [FromUri] attriubte.su URL se ve así:
fuente
List<string>
lugar de solostring
? solo tendrá una cadena que está1,2,3,289,56
en su ejemplo. Sugeriré una edición.List<Guid>
embargo, me sorprendió que mi controlador no se uniera automáticamente. Tenga en cuenta en Asp.net Core que la anotación es[FromQuery]
, y no es necesaria.Haga que el método escriba [HttpPost], cree un modelo que tenga un parámetro int [] y publique con json:
fuente
public IEnumerable<Category> GetCategories(int[] categoryIds){
- Sí, podrías interpretar de diferentes maneras, supongo. Pero muchas veces, no quiero crear clases de envoltorios por crear envoltorios. Si tiene objetos complejos, eso simplemente funcionará. Apoyar estos casos más simples es lo que no funciona de fábrica, de ahí el OP.POST
está realmente en contra del paradigma REST. Por lo tanto, dicha API no sería una API REST.O simplemente puede pasar una cadena de elementos delimitados y ponerlos en una matriz o lista en el extremo receptor.
fuente
Abordé este problema de esta manera.
Utilicé un mensaje de publicación en la API para enviar la lista de enteros como datos.
Luego devolví los datos como un número inevitable.
El código de envío es el siguiente:
El código de recepción es el siguiente:
Funciona bien para un registro o muchos registros. El relleno es un método sobrecargado que usa DapperExtensions:
Esto le permite obtener datos de una tabla compuesta (la lista de id) y luego devolver los registros que realmente le interesan de la tabla de destino.
Puede hacer lo mismo con una vista, pero esto le da un poco más de control y flexibilidad.
Además, los detalles de lo que está buscando en la base de datos no se muestran en la cadena de consulta. Tampoco tiene que convertir desde un archivo csv.
Debe tener en cuenta al usar cualquier herramienta como la interfaz web api 2.x, es que las funciones get, put, post, delete, head, etc. tienen un uso general, pero no están restringidas a ese uso.
Por lo tanto, aunque la publicación se usa generalmente en un contexto de creación en la interfaz de la API web, no se limita a ese uso. Es una llamada html normal que se puede usar para cualquier propósito permitido por la práctica html.
Además, los detalles de lo que está sucediendo están ocultos para esos "ojos curiosos" de los que tanto escuchamos en estos días.
La flexibilidad en las convenciones de nomenclatura en la interfaz de la API web 2.x y el uso de llamadas web regulares significa que envía una llamada a la API web que engaña a los intrusos para que piensen que realmente está haciendo otra cosa. Puede usar "POST" para realmente recuperar datos, por ejemplo.
fuente
He creado un archivador de modelo personalizado que convierte cualquier valor separado por comas (solo primitivo, decimal, flotante, cadena) en sus matrices correspondientes.
Y cómo usarlo en el controlador:
fuente
Mi solución fue crear un atributo para validar cadenas, hace un montón de características adicionales comunes, incluida la validación de expresiones regulares que puede usar para verificar solo los números y luego convertirlos a enteros según sea necesario ...
Así es como usas:
fuente