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