Eu tenho um serviço REST da API da Web do ASP.NET (versão 4) em que preciso passar uma matriz de números inteiros.
Aqui está o meu método de ação:
public IEnumerable<Category> GetCategories(int[] categoryIds){
// code to retrieve categories from database
}
E esta é a URL que eu tentei:
/Categories?categoryids=1,2,3,4
c#
arrays
rest
asp.net-web-api
Hemanshu Bhojak
fonte
fonte
Respostas:
Você só precisa adicionar o
[FromUri]
parâmetro before, se parece com:E envie a solicitação:
fonte
Como Filip W aponta, você pode ter que recorrer a um fichário de modelo personalizado como este (modificado para vincular ao tipo real de parâmetros):
E então você pode dizer:
/Categories?categoryids=1,2,3,4
e a API da Web do ASP.NET vincularão corretamente suacategoryIds
matriz.fonte
ModelBinderAttribute
isso facilmente, para que possa ser usado diretamente em vez da laboriosa sintaxe usando otypeof()
argumento Tudo que você tem a fazer é herdar assim:CommaDelimitedArrayModelBinder : ModelBinderAttribute, IModelBinder
e em seguida, fornecer um construtor padrão que empurra a definição do tipo de baixo para a classe base:public CommaDelimitedArrayModelBinder() : base(typeof(CommaDelimitedArrayModelBinder)) { }
.System.Collections.Generic.List<long>
comobindingContext.ModelType.GetElementType()
único apoioSystem.Array
tiposRecentemente, me deparei com esse requisito e decidi implementar um
ActionFilter
para lidar com isso.Estou aplicando dessa maneira (observe que usei 'id', não 'ids', pois é assim que é especificado na minha rota):
E o URL público seria:
Pode ser necessário refatorá-lo para atender às suas necessidades específicas.
fonte
Caso alguém precise - para conseguir algo igual ou semelhante (como excluir) via em
POST
vez deFromUri
, useFromBody
e no lado do cliente (JS / jQuery), o parâmetro param como$.param({ '': categoryids }, true)
c #:
jQuery:
O problema
$.param({ '': categoryids }, true)
é que ele .net espera que o corpo do post contenha valor codificado em url, como=1&=2&=3
sem nome do parâmetro e sem colchetes.fonte
code to retrieve categories from database
, portanto, o método deve ser um método GET, não POST.Maneira fácil de enviar parâmetros de matriz para API da Web
API
Jquery: envia o objeto JSON como parâmetros de solicitação
Ele irá gerar o URL da sua solicitação, como
../api/categories/GetCategories?categoryIds=1&categoryIds=2&categoryIds=3&categoryIds=4
fonte
Você pode tentar este código para obter valores separados por vírgula / uma matriz de valores para recuperar um JSON da webAPI
Resultado :
fonte
Solução ASP.NET Core 2.0 (pronta para o Swagger)
Entrada
Código
Escreva o provedor (como o MVC sabe qual fichário usar)
Escreva o fichário real (acesse todos os tipos de informações sobre a solicitação, ação, modelos, tipos, o que for)
Registre-o no MVC
Exemplo de uso com um controlador bem documentado para o Swagger
EDIT: Microsoft recomenda o uso de um TypeConverter para esses filhos de operações sobre essa abordagem. Portanto, siga os conselhos dos pôsteres abaixo e documente seu tipo personalizado com um SchemaFilter.
fonte
Em vez de usar um ModelBinder personalizado, você também pode usar um tipo personalizado com um TypeConverter.
A vantagem é que isso torna os parâmetros do método da API da Web muito simples. Você nem precisa especificar [FromUri].
Este exemplo é para uma lista de seqüências de caracteres, mas você pode fazer
categoryIds.Select(int.Parse)
ou simplesmente escrever uma IntList.fonte
Originalmente, usei a solução que @Mrchief por anos (funciona muito bem). Mas quando adicionei o Swagger ao meu projeto para documentação da API, meu ponto final NÃO estava aparecendo.
Demorei um pouco, mas foi isso que eu criei. Funciona com o Swagger, e suas assinaturas de método de API parecem mais limpas:
No final, você pode fazer:
WebApiConfig.cs
Crie uma nova classe: CommaDelimitedArrayParameterBinder.cs
Crie uma nova classe: StringToIntArrayConverter.cs
Notas:
fonte
Uso:
Request uri
fonte
/
como o separador? Em seguida, você poderia ter: dns / root / mystuff / path / to / some / recurso mapeado parapublic string GetMyStuff(params string[] pathBits)
Se você deseja listar / matriz de números inteiros, a maneira mais fácil de fazer isso é aceitar a lista de strings separada por vírgula (,) e convertê-la em lista de números inteiros. Não se esqueça de mencionar [FromUri] attriubte.
fonte
List<string>
vez de apenasstring
? ele terá apenas uma string, que está1,2,3,289,56
no seu exemplo. Vou sugerir uma edição.List<Guid>
automaticamente. Observe no Asp.net Core que a anotação é[FromQuery]
e não é necessária.Crie o tipo de método [HttpPost], crie um modelo que tenha um parâmetro int [] e poste com json:
fonte
public IEnumerable<Category> GetCategories(int[] categoryIds){
- Sim, você poderia interpretar de maneiras diferentes, suponho. Mas muitas vezes, não quero criar classes de wrapper para criar wrappers. Se você tiver objetos complexos, isso funcionará. Apoiar esses casos mais simples é o que não funciona imediatamente, daí o OP.POST
é realmente contra o paradigma REST. Portanto, essa API não seria uma API REST.Ou você pode simplesmente passar uma sequência de itens delimitados e colocá-la em uma matriz ou lista no lado de recebimento.
fonte
Eu resolvi esse problema dessa maneira.
Eu usei uma mensagem de postagem na API para enviar a lista de números inteiros como dados.
Depois, retornei os dados como inumeráveis.
O código de envio é o seguinte:
O código de recebimento é o seguinte:
Funciona muito bem para um registro ou muitos registros. O preenchimento é um método sobrecarregado usando DapperExtensions:
Isso permite que você busque dados de uma tabela composta (a lista de IDs) e, em seguida, retorne os registros de seu interesse na tabela de destino.
Você poderia fazer o mesmo com uma visualização, mas isso lhe dará um pouco mais de controle e flexibilidade.
Além disso, os detalhes do que você está procurando no banco de dados não são mostrados na string de consulta. Você também não precisa converter de um arquivo csv.
Você deve ter em mente que, ao usar qualquer ferramenta como a interface da API da Web 2.x, as funções get, put, post, delete, head, etc. têm um uso geral, mas não estão restritas a esse uso.
Portanto, embora a postagem geralmente seja usada em um contexto de criação na interface da API da web, ela não se restringe a esse uso. É uma chamada html regular que pode ser usada para qualquer finalidade permitida pela prática html.
Além disso, os detalhes do que está acontecendo estão ocultos daqueles "olhares indiscretos" que ouvimos muito sobre esses dias.
A flexibilidade nas convenções de nomenclatura na interface da API da Web 2.x e o uso de chamadas regulares na Web significa que você envia uma chamada para a API da Web que induz os bisbilhoteiros a pensar que você está realmente fazendo outra coisa. Você pode usar "POST" para realmente recuperar dados, por exemplo.
fonte
Criei um fichário de modelo personalizado que converte qualquer valor separado por vírgula (apenas primitivo, decimal, flutuante, sequência de caracteres) em suas matrizes correspondentes.
E como usar no Controller:
fonte
Minha solução foi criar um atributo para validar seqüências de caracteres, ele faz um monte de recursos extras comuns, incluindo validação de regex que você pode usar para verificar apenas números e depois converter para números inteiros, conforme necessário ...
É assim que você usa:
fonte