Quero lidar com o POST da seguinte API-Call:
/v1/location/deviceid/appid
Parâmetros adicionais estão vindo do Post-Body.
Tudo isso funciona bem para mim. Agora quero estender meu código permitindo que "deviceid" e / ou "appid" e / ou BodyData sejam nulos:
/v1/location/deviceid
/v1/location/appid
/v1/location/
Esses 3 URLs devem responder pela mesma rota.
Minha primeira abordagem (BodyData obrigatório):
[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post(string deviceid = null, string appid = null, [FromBody] location_fromuser BodyData)
{
return repository.AddNewLocation(deviceid, appid, BodyData);
}
Isso não funciona e retorna um erro de compilação:
"Parâmetros opcionais devem estar no final"
Próxima tentativa:
[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post([FromBody] location_fromuser BodyData, string deviceid = null, string appid = null)
Agora minha função AddNewLocation () sempre obtém um BodyData=null
- mesmo se a chamada enviar o Corpo.
Finalmente, defino todos os 3 parâmetros opcionais:
[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post(string deviceid = null, string appid = null, [FromBody location_fromuser BodyData = null)
Não trabalhe:
O parâmetro opcional
BodyData
não é compatível comFormatterParameterBinding
.
Por que eu quero uma solução com parâmetros opcionais? Meu controlador lida apenas com a "adição de um novo local" por meio de um POST.
Quero enviar com dados errados minhas próprias exceções ou mensagens de erro. Mesmo se a chamada tiver valores ausentes. Nesse caso, quero poder decidir lançar uma exceção ou definir padrões pelo meu código.
fonte
?
dentro do modelo de rota é o que eu estava procurando. +1?
caractere, devemos fornecer valores padrão para os parâmetros na assinatura do método, por exemplo, MyMethod (string name = "someDefaultValue", int? Id = null).Outra informação: se você quiser usar uma Restrição de Rota , imagine que deseja forçar que o parâmetro tenha o tipo de dados int , então você precisa usar esta sintaxe:
O ? personagem é colocado sempre antes do último } caráter
Para obter mais informações, consulte: Parâmetros de URI opcionais e valores padrão
fonte
Converter meu comentário em uma resposta para complementar a resposta de @Kiran Chala, pois parece útil para o público-
Quando marcamos um parâmetro como opcional na ação uri usando
?
caractere, devemos fornecer valores padrão para os parâmetros na assinatura do método, conforme mostrado abaixo:MyMethod(string name = "someDefaultValue", int? Id = null)
fonte