Chcę obsłużyć POST następującego wywołania API:
/v1/location/deviceid/appid
Dodatkowe parametry pochodzą z post-body.
To wszystko działa dobrze dla mnie. Teraz chcę rozszerzyć mój kod, zezwalając „deviceid” i / lub „appid” i / lub BodyData na null:
/v1/location/deviceid
/v1/location/appid
/v1/location/
Te 3 adresy URL powinny odpowiadać tą samą drogą.
Moje pierwsze podejście (wymagane 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);
}
To nie działa i zwraca błąd kompilacji:
„Opcjonalne parametry muszą znajdować się na końcu”
Następna próba:
[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post([FromBody] location_fromuser BodyData, string deviceid = null, string appid = null)
Teraz moja funkcja AddNewLocation () otrzymuje zawsze BodyData=null
- nawet jeśli wywołanie wysyła Body.
Na koniec ustawiłem wszystkie 3 parametry jako opcjonalne:
[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post(string deviceid = null, string appid = null, [FromBody location_fromuser BodyData = null)
Nie działa:
Opcjonalny parametr
BodyData
nie jest obsługiwany przezFormatterParameterBinding
.
Dlaczego chcę rozwiązania z opcjonalnymi parametrami? Mój kontroler obsługuje tylko „dodawanie nowej lokalizacji” przez POST.
Chcę wysyłać własne wyjątki lub komunikaty o błędach w przypadku złych danych. Nawet jeśli w wywołaniu brakuje wartości. W takim przypadku chcę móc zdecydować o rzuceniu wyjątku lub ustawieniu wartości domyślnych przez mój kod.
?
wewnątrz szablonu trasy jest to, czego szukałem. +1