Quiero manejar POST de la siguiente API-Call:
/v1/location/deviceid/appid
Los parámetros adicionales provienen del Post-Body.
Todo esto funciona bien para mí. Ahora quiero extender mi código permitiendo que "deviceid" y / o "appid" y / o BodyData sean nulos:
/v1/location/deviceid
/v1/location/appid
/v1/location/
Estas 3 URL deben responder por la misma ruta.
Mi primer enfoque (se requiere BodyData):
[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);
}
Esto no funciona y devuelve un error de compilación:
"Los parámetros opcionales deben estar al final"
Siguiente intento:
[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post([FromBody] location_fromuser BodyData, string deviceid = null, string appid = null)
Ahora mi función AddNewLocation () siempre obtiene un BodyData=null
- incluso si la llamada envía el Body.
Finalmente configuré los 3 parámetros opcionales:
[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post(string deviceid = null, string appid = null, [FromBody location_fromuser BodyData = null)
No trabaje:
El parámetro opcional
BodyData
no es compatible conFormatterParameterBinding
.
¿Por qué quiero una solución con parámetros opcionales? Mi controlador se encarga simplemente de "agregar una nueva ubicación" a través de un POST.
Quiero enviar mis propias excepciones o mensajes de error con datos incorrectos. Incluso si a la llamada le faltan valores. En este caso, quiero poder decidir lanzar una excepción o establecer valores predeterminados por mi código.
?
dentro de la plantilla de ruta es lo que estaba buscando. +1