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.
?
dentro do modelo de rota é o que eu estava procurando. +1