Web API 속성 라우팅의 선택적 매개변수
다음 API-Call의 POST를 처리하려고 합니다.
/v1/location/deviceid/appid
추가 매개 변수는 사후 본문에서 가져옵니다.
저는 이 모든 것이 잘 됩니다.이제 "deviceid" 및/또는 "appid" 및/또는 BodyData를 null로 허용하여 코드를 확장합니다.
/v1/location/deviceid
/v1/location/appid
/v1/location/
이 세 개의 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
.
옵션 매개 변수가 있는 솔루션이 필요한 이유는 무엇입니까?내 컨트롤러는 POST를 통해 "새로운 위치 추가"만 처리합니다.
잘못된 데이터에 나만의 예외나 오류 메시지를 보내고 싶습니다.호출에 결측값이 있는 경우에도 마찬가지입니다.이 경우 코드에 따라 예외를 발생시키거나 기본값을 설정할지 결정할 수 있습니다.
다음과 같은 수신 요청의 경우/v1/location/1234
당신이 상상할 수 있듯이 웹 API가 '1234'에 해당하는 세그먼트의 값이 다음과 관련이 있는지 자동으로 파악하는 것은 어려울 것입니다.appid
하지도 마deviceid
.
경로 템플릿을 다음과 같이 변경해야 한다고 생각합니다.[Route("v1/location/{deviceOrAppid?}", Name = "AddNewLocation")]
그런 다음 구문 분석합니다.deiveOrAppid
ID의 유형을 파악하기 위해.
또한 경로 템플릿 자체의 세그먼트를 선택 사항으로 만들어야 합니다. 그렇지 않으면 세그먼트가 필요한 것으로 간주됩니다.참고:?
이 경우의 성격.예:[Route("v1/location/{deviceOrAppid?}", Name = "AddNewLocation")]
다른 정보:경로 제약 조건을 사용하려면 매개 변수에 int 데이터 유형이 포함되도록 하려면 다음 구문을 사용해야 합니다.
[Route("v1/location/**{deviceOrAppid:int?}**", Name = "AddNewLocation")]
? 문자는 항상 마지막 } 문자 앞에 놓입니다.
자세한 내용은 다음을 참조하십시오.선택적 URI 매개 변수 및 기본값
@Kiran Chala의 대답을 보완할 추가적인 사실 -
매개변수를 표시할 때(appid
) 작업 URI에서 옵션으로 사용?
문자(null 가능한 값 유형의 경우)를 입력한 다음 아래와 같이 메서드 시그니처의 매개 변수에 기본값을 제공해야 합니다.
[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post(string deviceid, int? appid = null)
네, 저는 인터넷 조사로 여기에 떨어졌고, 저는 제 길을 계속 가고 있습니다. 왜냐하면 승인된 해결책이 닷넷 코어 3.1에서 작동하지 않기 때문입니다.그래서 여기 이 문서를 따르는 제 해결책이 있습니다.
[HttpPost]
[Route("{name}")]
[Route("{name}/parent/{parentId}")]
public async Task<IActionResult> PostSomething(string name, Guid? parentId = null)
{
return Ok(await Task.FromResult(new List<string>()));
}
이를 통해 많은 경로가 이 단일 API 함수로 이동합니다.
언급URL : https://stackoverflow.com/questions/22778640/optional-parameters-in-web-api-attribute-routing
'code' 카테고리의 다른 글
SQL Server에서 결과를 페이지로 이동하는 가장 좋은 방법은 무엇입니까? (0) | 2023.05.03 |
---|---|
Mongoose 채우기 대 개체 중첩 (0) | 2023.05.03 |
부분 선언은 서로 다른 기본 클래스를 지정할 수 없습니다. (0) | 2023.04.28 |
를 사용하여 프로그램이 시스템 트레이에 최소화되도록 하는 가장 쉬운 방법입니다.NET 4 (0) | 2023.04.28 |
@SuppressLint 또는 @TargetApi 중 더 나은 것은 무엇입니까? (0) | 2023.04.28 |