asp.net-web-api
웹 API URL 라우팅
수색…
asp.net webapi에서 라우팅이 작동하는 방법
ASP.NET 웹 API에서 컨트롤러는 HTTP 요청을 처리하는 클래스입니다. 컨트롤러의 공용 메소드를 액션 메소드 또는 단순히 액션이라고합니다.
Web API 프레임 워크는 요청을 수신하면 요청을 조치로 라우트합니다. 호출 할 동작을 결정하기 위해 프레임 워크는 라우팅 테이블을 사용합니다. 웹 API 용 Visual Studio 프로젝트 템플릿은 기본 경로를 만듭니다.
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "**api/{controller}/{id}**",
defaults: new { id = RouteParameter.Optional }
);
이 경로는 App_Start 디렉터리에있는 WebApiConfig.cs 파일에 정의되어 있습니다.
라우팅 테이블의 각 항목에는 경로 템플리트가 있습니다. 웹 API의 기본 경로 템플리트는 " api / {controller} / {id} "입니다. 이 템플릿에서 " api "는 리터럴 경로 세그먼트이고 { controller } 및 { id }는 자리 표시 자 변수입니다.
웹 API 프레임 워크가 HTTP 요청을 수신하면 라우팅 테이블의 라우트 템플리트 중 하나와 URI를 일치 시키려고 시도합니다. 경로가 일치하지 않으면 클라이언트는 404 오류를 수신합니다.
예를 들어 다음 URI는 기본 경로와 일치합니다.
- / api / 값
- / api / 값 / 1
그러나 " api "세그먼트가 없기 때문에 다음 URI가 일치하지 않습니다.
- / 값 / 1
일치하는 라우트가 발견되면 웹 API는 컨트롤러와 조치를 선택합니다.
- 컨트롤러를 찾으려면 웹 API가 {controller} 변수의 값에 "Controller"를 추가합니다.
- 조치를 찾으려면 웹 API가 HTTP 메소드를 확인한 다음 해당 HTTP 메소드 이름으로 시작하는 이름의 조치를 찾습니다. 예를 들어 GET 요청의 경우 웹 API는 "GetEmployee"또는 "GetAllEmployees"와 같이 "Get ..."으로 시작하는 동작을 찾습니다. 이 규약은 GET, POST, PUT 및 DELETE 메서드에만 적용됩니다.
컨트롤러의 속성을 사용하여 다른 HTTP 메소드를 활성화 할 수 있습니다. 우리는 그 예를 나중에 보게 될 것입니다.
- 경로 템플릿의 다른 자리 표시 자 변수 (예 : {id})는 작업 매개 변수에 매핑됩니다.
HTTP 메서드 HTTP 메서드 에 명명 규칙을 사용하는 대신 HttpGet, HttpPut, HttpPost 또는 HttpDelete 특성을 사용하여 동작 메서드를 꾸미면 작업에 대한 HTTP 메서드를 명시 적으로 지정할 수 있습니다.
다음 예제에서 EmployeeGetEmployee 메서드는 GET 요청에 매핑됩니다.
public class EmployeesController : ApiController
{
[HttpGet]
public EmployeeGetEmployee(id) {}
}
동작에 대해 여러 HTTP 메서드를 허용하거나 GET, PUT, POST 및 DELETE 이외의 HTTP 메서드를 허용하려면 HTTP 메서드 목록을 사용하는 AcceptVerbs 특성을 사용합니다.
public class EmployeesController: ApiController
{
[AcceptVerbs("GET", "HEAD")]
public Employee GetEmployee (id) { }
}
작업 이름 별 라우팅
기본 라우팅 템플리트의 경우, 웹 API는 HTTP 메소드를 사용하여 조치를 선택합니다. 그러나 작업 이름이 URI에 포함 된 경로를 만들 수도 있습니다.
routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
이 라우트 템플리트에서 {action} 매개 변수는 컨트롤러에서 조치 메소드의 이름을 지정합니다. 이 라우팅 스타일로 속성을 사용하여 허용 된 HTTP 메소드를 지정하십시오. 예를 들어 컨트롤러에 다음과 같은 방법이 있다고 가정 해보십시오.
public class EmployeesController: ApiController
{
[HttpGet]
public List<Employee> GetAllEmployees();
}
이 경우 " api / Employees / GetAllEmployees "에 대한 GET 요청은 GetAllEmployees 메소드에 매핑됩니다.
ActionName 특성을 사용하여 작업 이름을 재정의 할 수 있습니다. 다음 예제에서는 " api / Employees / ShowAllEmployees / id "에 매핑되는 두 가지 작업이 있습니다. 하나는 GET을 지원하고 다른 하나는 POST를 지원합니다.
public class EmployeesController : ApiController
{
[HttpGet]
[ActionName("ShowAllEmployees")]
public List<Employee> GetAll(int id);
[HttpPost]
[ActionName("ShowAllEmployees")]
public void GetAll (int id);
}
비 액션
NonAction 속성을 사용하여 메소드가 조치로 호출되지 않도록 할 수 있습니다. 이것은 프레임 워크가 그렇지 않은 경우 라우팅 규칙과 일치 할지라도 메서드가 액션이 아니라는 것을 신호로 보냅니다.
[NonAction]
public string GetValues() { ... }
동사 기반 라우팅 예제.
서로 다른 HTTP 메소드에 대해 동일한 UR1이 다르게 작동합니다. 아래는 같은 것을 묘사 한 표입니다.
| HTTP 동사 | URL | 기술 |
|---|---|---|
| 도망 | / api / students | 모든 학생들을 돌려줍니다. |
| 도망 | / api / students / 5 | 학생 ID = 5의 세부 정보를 반환합니다. |
| 우편 | / api / students | 새 학생 추가 |
| 놓다 | / api / students / 5 | ID = 5 인 학생 업데이트 |
| 지우다 | / api / students / 5 | Id = 5 인 학생 삭제 |