No WebAPI, o corpo da requisição (HttpContent) só pode ser lido uma vez, não armazenado em cache, e só pode ser lido para frente.
Por exemplo:
1. Endereço do pedido: /?id=123&name=bob
Método do lado do servidor: void Action(int id, string name) // Todos os parâmetros são tipos simples, então todos virão da url
2. Endereço do pedido: /?id=123&name=bob
Método do lado do servidor: void Ação([FromUri] int id, [FromUri] nome da cadeia) // Igual ao acima
void Action(nome da string [FromBody]); O atributo [FormBody] exibe que todo o corpo é lido como uma string como um argumento
3. Endereço do pedido: /?id=123
Definição da Classe:
classe pública Customer { // Um tipo de objeto complexo definido Nome da cadeia pública { get; set; } public int Age { get; set; }
}
Método do lado do servidor: void Action(int id, Customer c) // O id do parâmetro é lido da string de consulta, o parâmetro c é uma classe complexa de objeto Customer, lida do corpo através do formatador
Método do lado do servidor: void action (Cliente c1, Cliente c2) // Erro! Múltiplos parâmetros são tipos complexos e todos tentam ler de um corpo, que só pode ser lido uma vez
Método do lado do servidor: void action([FromUri] Cliente c1, Cliente c2) // Sim! Diferentemente da ação acima, o tipo complexo C1 será lido da URL e C2 será lido do corpo
4. Método ModelBinder:
void Action([ModelBinder(MyCustomBinder)] SomeType c) // Indica que um binder de modelo específico é usado para resolver o parâmetro
[ModelBinder(MyCustomBinder)] classe pública SomeType { } // Aplique essa regra a todos os parâmetros SomeType declarando o atributo [ModelBidner(MyCustomBinder)] a um tipo específico SomeType
void Ação(SomeType c) // Como o tipo de c é SomeType, as características em SomeType são aplicadas para determinar sua ligação ao modelo
Resumo:
1. Os parâmetros simples padrão são passados pelos parâmetros de URL, com exceções:
1.1 Se a rota contém o parâmetro id, o parâmetro id é passado pela rota;
1.2 Se o parâmetro for marcado como [FromBody], o parâmetro pode ser simples, e o cliente pode passá-lo via POST: $.ajax(url, '=valor'), ou $.ajax({url: url, data: {'': 'valor'}});
2. Os parâmetros complexos padrão (classes de entidade personalizadas) são passados via POST, com exceções:
2.1 Se o valor do parâmetro for marcado como [FromUri], o parâmetro pode ser um parâmetro complexo;
3. Um parâmetro marcado como [FromBody] pode aparecer apenas uma vez, um parâmetro marcado como [FromUri] pode aparecer várias vezes, e se o parâmetro marcado como [FromUri] for um parâmetro simples, a tag pode ser removida. |