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.
fuente
?
dentro de la plantilla de ruta es lo que estaba buscando. +1?
carácter, entonces debemos proporcionar valores predeterminados a los parámetros en la firma del método, por ejemplo, MyMethod (string name = "someDefaultValue", int? Id = null).Otra información: si desea usar una restricción de ruta , imagine que desea forzar que el parámetro tenga un tipo de datos int , entonces necesita usar esta sintaxis:
[Route("v1/location/**{deviceOrAppid:int?}**", Name = "AddNewLocation")]
El ? el carácter se pone siempre antes del último carácter }
Para obtener más información, consulte: Parámetros URI opcionales y valores predeterminados.
fuente
Convertir mi comentario en una respuesta para complementar la respuesta de @Kiran Chala, ya que parece útil para el público.
Cuando marcamos un parámetro como opcional en la uri de acción usando el
?
carácter, entonces debemos proporcionar valores predeterminados a los parámetros en la firma del método como se muestra a continuación:MyMethod(string name = "someDefaultValue", int? Id = null)
fuente