Необязательные параметры в маршрутизации атрибутов веб-Api
Я хочу обработать сообщение следующего API-вызова:
/v1/location/deviceid/appid
Дополнительные параметры идут от тела.
все это прекрасно работает для меня. Теперь я wnat, чтобы продлить мой код, позволяя "идентификатора устройства" и/или "код" и/или BodyData значение null:
/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
.
почему я хочу решение с дополнительными параметрами? Мой Контроллер обрабатывает только "добавление нового местоположения" через сообщение.
Я хочу отправить на неверные данные мои собственные исключения или сообщения об ошибках. Даже если вызов имеет пропущенные значения. В этом случае я хочу быть в состоянии решить, чтобы бросить исключение или настройки по умолчанию по моему коду.
3 ответа:
для входящего запроса, как
/v1/location/1234
, Как вы можете себе представить, было бы трудно для веб-API автоматически выяснить, связано ли значение сегмента, соответствующего "1234", сappid
, а неdeviceid
.Я думаю, что вы должны изменить свой шаблон маршрута, чтобы быть похожим
[Route("v1/location/{deviceOrAppid?}", Name = "AddNewLocation")]
а потом разобратьdeiveOrAppid
чтобы выяснить тип личности.также необходимо сделать сегменты в самом шаблоне маршрута необязательными в противном случае сегменты считаются по мере необходимости. Обратите внимание на
?
персонаж в этом случае. Например:[Route("v1/location/{deviceOrAppid?}", Name = "AddNewLocation")]
другая информация: Если вы хотите использовать Ограничение Маршруту представьте, что вы хотите силой, что параметр int тип данных, то вам нужно использовать следующий синтаксис:
[Route("v1/location/**{deviceOrAppid:int?}**", Name = "AddNewLocation")]
на ? символ ставится всегда перед последним } символ
дополнительная информация: необязательные параметры URI и значения по умолчанию
преобразование моего комментария в ответ, чтобы дополнить ответ @ Kiran Chala, поскольку это кажется полезным для аудитории -
когда мы отмечаем параметр как необязательный в uri действия с помощью
?
символ, то мы должны указать значения по умолчанию для параметров в сигнатуре метода, как показано ниже:
MyMethod(string name = "someDefaultValue", int? Id = null)