Estou tentando postar vários parâmetros em um controlador WebAPI. Um parâmetro é do URL e o outro do corpo. Aqui está o URL:
/offers/40D5E19D-0CD5-4FBD-92F8-43FDBB475333/prices/
Aqui está o código do meu controlador:
public HttpResponseMessage Put(Guid offerId, OfferPriceParameters offerPriceParameters)
{
//What!?
var ser = new DataContractJsonSerializer(typeof(OfferPriceParameters));
HttpContext.Current.Request.InputStream.Position = 0;
var what = ser.ReadObject(HttpContext.Current.Request.InputStream);
return new HttpResponseMessage(HttpStatusCode.Created);
}
O conteúdo do corpo está em JSON:
{
"Associations":
{
"list": [
{
"FromEntityId":"276774bb-9bd9-4bbd-a7e7-6ed3d69f196f",
"ToEntityId":"ed0d2616-f707-446b-9e40-b77b94fb7d2b",
"Types":
{
"list":[
{
"BillingCommitment":5,
"BillingCycle":5,
"Prices":
{
"list":[
{
"CurrencyId":"274d24c9-7d0b-40ea-a936-e800d74ead53",
"RecurringFee":4,
"SetupFee":5
}]
}
}]
}
}]
}
}
Alguma idéia de por que a ligação padrão não é capaz de se ligar ao offerPriceParameters
argumento do meu controlador? É sempre definido como nulo. Mas eu sou capaz de recuperar os dados do corpo usando o DataContractJsonSerializer
.
Também tento usar o FromBody
atributo do argumento, mas ele também não funciona.
.net
asp.net-web-api
Normand Bedard
fonte
fonte
O WebAPI nativamente não suporta a ligação de vários parâmetros POST. Como Colin aponta, há várias limitações descritas no meu post no blog que ele faz referência.
Existe uma solução alternativa ao criar um fichário de parâmetros personalizado. O código para fazer isso é feio e complicado, mas eu publiquei o código junto com uma explicação detalhada no meu blog, pronta para ser conectada a um projeto aqui:
Passando vários valores POST simples para a API da Web do ASP.NET
fonte
Se o roteamento de atributo estiver sendo usado, você poderá usar os atributos [FromUri] e [FromBody].
Exemplo:
fonte
[FromRoute]
vez de[FromUri]
Passamos o objeto Json pelo método HttpPost e o analisamos no objeto dinâmico. Funciona bem. este é um código de exemplo:
webapi:
O tipo de objeto complexo pode ser objeto, matriz e dicionário.
fonte
Uma classe de parâmetro simples pode ser usada para passar vários parâmetros em uma postagem:
fonte
Você pode permitir vários parâmetros POST usando a classe MultiPostParameterBinding em https://github.com/keith5000/MultiPostParameterBinding
Para usá-lo:
1) Faça o download do código na pasta Origem e adicione-o ao seu projeto de API da Web ou a qualquer outro projeto na solução.
2) Use o atributo [MultiPostParameters] nos métodos de ação que precisam oferecer suporte a vários parâmetros do POST.
3) Adicione esta linha no Global.asax.cs ao método Application_Start em qualquer lugar antes da chamada para GlobalConfiguration.Configure (WebApiConfig.Register) :
4) Faça com que seus clientes passem os parâmetros como propriedades de um objeto. Um exemplo de objeto JSON para o
DoSomething(param1, param2, param3)
método é:Exemplo de JQuery:
Visite o link para mais detalhes.
Isenção de responsabilidade: estou diretamente associado ao recurso vinculado.
fonte
Boa pergunta e comentários - aprendi muito com as respostas aqui :)
Como um exemplo adicional, observe que você também pode misturar corpo e rotas, por exemplo
Chamando assim:
fonte
Como é o seu routeTemplate para este caso?
Você postou este URL:
Para que isso funcione, eu esperaria um roteamento como este no seu
WebApiConfig
:Outras suposições são: - seu controlador é chamado
OffersController
. - o objeto JSON que você está passando no corpo da solicitação é do tipoOfferPriceParameters
(não qualquer tipo derivado) - você não possui outros métodos no controlador que possam interferir nesse (se houver, tente comentá-los e ver o que acontece)E, como Filip mencionou, ajudaria suas perguntas se você começasse a aceitar algumas respostas, pois 'taxa de aceitação de 0%' pode fazer as pessoas pensarem que estão perdendo tempo.
fonte
Se você não deseja seguir o caminho ModelBinding, pode usar DTOs para fazer isso por você. Por exemplo, crie uma ação POST no DataLayer que aceite um tipo complexo e envie dados do BusinessLayer. Você pode fazer isso no caso de UI-> chamada de API.
Aqui estão os exemplos de DTO. Designe um professor para um aluno e atribua vários papéis / assunto ao aluno.
Em seguida, a ação no DataLayer pode ser criada como:
Para chamá-lo do BusinessLayer:
Agora isso ainda funcionará se eu quiser enviar dados de vários Alunos de uma só vez. Modifique
MyAction
como abaixo. Não há necessidade de escrever [FromBody], o WebAPI2 assume o tipo complexo [FromBody] por padrão.e, ao chamá-lo, passe um
List<StudentCurriculumDTO>
dado.fonte
Solicitar parâmetros como
Código da API da Web seja como
fonte
Você pode obter os dados do formulário como string:
https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-2
fonte