Необязательные параметры в маршрутизации атрибутов веб-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 65

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)