Я хочу обрабатывать POST из следующего API-вызова:
/v1/location/deviceid/appid
Дополнительные параметры поступают из пост-тела.
Все это отлично работает для меня. Теперь я хочу расширить свой код, разрешив "deviceid" и/или "appid" и/или BodyData быть нулевым:
/v1/location/deviceid
/v1/location/appid
/v1/location/
Эти 3 URL-адреса должны отвечать на один и тот же маршрут.
Мой первый подход (требуется 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);
}
Это не работает и возвращает ошибку компиляции:
"необязательные параметры должны быть в конце"
Следующая попытка:
[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post([FromBody] location_fromuser BodyData, string deviceid = null, string appid = null)
Теперь моя функция AddNewLocation() всегда получает BodyData=null
- даже если вызов отправляет тело.
Наконец, я устанавливаю все 3 параметра необязательно:
[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post(string deviceid = null, string appid = null, [FromBody location_fromuser BodyData = null)
Не работайте:
Необязательный параметр
BodyData
не поддерживаетсяFormatterParameterBinding
.
Почему я хочу решение с дополнительными параметрами? Мой контроллер обрабатывает только "добавление нового местоположения" через POST.
Я хочу отправить неверные данные своим собственным исключениям или сообщениям об ошибках. Даже если в вызове отсутствуют значения. В этом случае я хочу иметь возможность принять решение об исключении или настройке значений по умолчанию моим кодом.