웹 API 속성 라우팅의 선택적 매개 변수


90

다음 API 호출의 POST를 처리하고 싶습니다.

/v1/location/deviceid/appid

추가 매개 변수는 포스트 바디에서 제공됩니다.

이 모든 것이 잘 작동합니다. 이제 "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를 통해 "새 위치 추가"만 처리합니다.

잘못된 데이터를 내 자신의 예외 또는 오류 메시지로 보내고 싶습니다. 호출에 누락 된 값이 있더라도. 이 경우 예외를 던지거나 내 코드로 기본값 설정을 결정할 수 있기를 원합니다.

답변:


177

들어오는 요청의 경우처럼 /v1/location/1234당신이에 대한 웹 API에 대한 어려울 것이다 상상할 수있는 세그먼트의 값이 '1234'에 해당하는 경우 자동으로 파악, 관련이 appid하지에 deviceid.

경로 템플릿을 변경 [Route("v1/location/{deviceOrAppid?}", Name = "AddNewLocation")]한 다음 파싱하여 deiveOrAppidID 유형을 파악 해야한다고 생각합니다 .

또한 경로 템플릿 자체의 세그먼트를 선택 사항으로 만들어야합니다. 그렇지 않으면 세그먼트가 필수로 간주됩니다. ?이 경우 문자에 유의하십시오 . 예를 들면 : [Route("v1/location/{deviceOrAppid?}", Name = "AddNewLocation")]


56
?라우트 템플릿 안에 제가 찾던 것입니다. +1
Kal_Torak

4
"deviceOrAppId"가 최고의 디자인 선택이라고 말하지 않겠습니다. API는 가능하다면 무엇을 받을지 정의상 항상 알아야한다고 생각합니다.
Niels Brinch 2016-08-06

14
정보 용- ?문자를 사용하여 조치 uri에서 매개 변수를 선택 사항으로 표시 할 때 메소드 서명의 매개 변수에 기본값을 제공해야합니다 (예 : MyMethod (string name = "someDefaultValue", int? Id = null)).
RBT

@RBT 당신은 진짜 MVP입니다, 나는 잠시 동안 거기에 걸렸습니다. 감사합니다!
sm

1
멋있는. @sm 도움이되어 다행입니다. 도움이되는 것처럼 보이기 때문에 내 의견을 더 나은 가시성을 위해 답변으로 변환했습니다. Kiran의 게시물에 대한 추가 기능이 될 것입니다.
RBT

45

또 다른 정보 : Route Constraint를 사용하려면 해당 매개 변수가 int 데이터 유형 을 갖도록 강제하려는 경우 다음 구문을 사용해야합니다.

[Route("v1/location/**{deviceOrAppid:int?}**", Name = "AddNewLocation")]

? 문자는 항상 마지막 } 문자 앞에 놓입니다.

자세한 내용은 선택적 URI 매개 변수 및 기본값을 참조하십시오.


18

내 의견을 답변으로 변환하여 청중에게 도움이 될 것 같아 @Kiran Chala의 답변을 보완하기 위해-

?문자를 사용하여 조치 uri에서 매개 변수를 선택 사항으로 표시 할 때 아래와 같이 메소드 서명의 매개 변수에 기본값을 제공해야합니다.

MyMethod(string name = "someDefaultValue", int? Id = null)


나는 똑같은 말을하려고했다.
Jnr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.