ASP. NET 5 시리즈 튜 토리 얼 (7) 완결 편 - 판독 코드
[Route] 속성 은 Controller 의 URL 템 플 릿 을 정의 합 니 다.
[Route("")]
이 템 플 릿 형식 에 맞 는 모든 HTTP 요청 은 이 controller 로 연 결 됩 니 다.이 예 에서 경로 의 이름 은 Controller 에 대응 하 는 접두사 이 고 TodoController 류 에 대해 서 는 템 플 릿 이 'api / todo' 입 니 다.
HTTP 방법
[HttpGet], [HttpPost] 와 [HttpDelete] 속성 을 controller 동작 에 대응 하 는 HTTP 방법 으로 정의 합 니 다 (또한 [HttpPut] 와 [HttpPatch] 속성 도 있 으 며, 이 예제 에 서 는 사용 되 지 않 았 습 니 다.)
[HttpGet]
IEnumerable<TodoItem> GetAll() {}
[HttpGet("", Name = "")]
IActionResult GetById (int id) {}
[HttpPost]
void CreateTodoItem([FromBody] TodoItem item) {}
[HttpDelete("")]
IActionResult DeleteItem(int id) {}
GetById 와 DeleteItem 방법의 매개 변 수 는 루트 의 전달 정 보 를 증가 시 킬 수 있다.따라서 루트 템 플 릿 의 보다 완벽 한 문법 은 'api / [controller] / {id: int}' 입 니 다.
"{id: int}" 에서 id 는 변수 이 고 "int" 는 매개 변 수 를 정형 으로 합 니 다.다음은 URL 인 스 턴 스 입 니 다.http://localhost/api/todo/1
http://localhost/api/todo/42
다음 으로 쓸 수 없습니다:http://localhost/api/todo/abc
GetById 와 DeleteItem 방법 역시 id 라 는 인 자 를 가지 고 있 습 니 다.프레임 워 크 는 컨트롤 러 에 실제 값 을 자동 으로 전달 합 니 다.하면, 만약, 만약...http://localhost/api/todo/42, id 의 값 은 42 이 고 이 과정 은 매개 변수 로 연 결 됩 니 다.
Create Todo Item 방법 은 다른 매개 변수 바 인 딩 을 대표 합 니 다:[HttpPost]
void CreateTodoItem([FromBody] TodoItem item) {}
[FromBody] 속성 지정 framework 는 Request 에서 TodoItem 인 자 를 역 직렬 화 합 니 다.
다음은 request 와 contrller 동작 에 대응 하 는 목록 입 니 다.
Request
Controller Action
GET /api/todo
GetAll
POST /api/todo
CreateTodoItem
GET /api/todo/1
GetById
DELETE /api/todo/1
DeleteItem
GET /api/todo/abc
none – returns 404
PUT /api/todo
none – returns 404
마지막 두 가지 예 는 다른 용도 로 404 오 류 를 되 돌려 줍 니 다.예 를 들 어 'GET / api / todo / abc', 'abc' 실 참 은 GetById 방법 에서 요구 하 는 정형 데이터 형식 이다.
액 션 반환 값
TodoController 류 는 다양한 contrller action 의 반환 값 방법 을 보 여 줍 니 다.
GetAll 방법 은 CLR 대상 을 되 돌려 줍 니 다.[HttpGet]
IEnumerable<TodoItem> GetAll()
{
_items;
}
반환 대상 의 직렬 화 정 보 는 Response 메시지 에 저 장 됩 니 다.기본 형식 은 JSON 이 고 클 라 이언 트 역시 XML 데이터 형식 을 받 을 수 있 습 니 다.http://localhost:5000/api/todo HTTP/1.1
User-Agent: Fiddler
Host: localhost:5000
Accept: application/xml
Response:HTTP/1.1 200 OK
Content-Type: application/xml;charset=utf-8
Server: Microsoft-HTTPAPI/2.0
: Thu, 30 Oct 2014 22:40:10 GMT
Content-Length: 228
<ArrayOfTodoItem xmlns:i="" xmlns=""><TodoItem><Id>1</Id><IsDone></IsDone><Title>First Item</Title></TodoItem></ArrayOfTodoItem>
GetById 방법 은 IAction Result 인 터 페 이 스 를 되 돌려 줍 니 다:[HttpGet("", Name = "")]
IActionResult GetById (int id)
{
var item = _items.FirstOrDefault(x => x.Id == id);
(item == null)
{
HttpNotFound();
}
ObjectResult(item);
}
URL 에 대응 하 는 id 가 있 으 면 이 방법 은 Object Result 로 돌아 갑 니 다.Object Result 를 되 돌려 주 는 것 은 CLR 모델 을 되 돌려 주 는 것 과 같 습 니 다.방법 에 서 는 반환 유형 을 IAction Result 로 규정 하고 있다.따라서 이 방법 은 다른 유형 으로 돌아 갈 수 있다.
대응 하 는 ID 가 없 으 면 HttpNotFound 로 돌아 가면 페이지 에 404 오류 가 발생 합 니 다.
마지막 으로 Create Todo Item 방법 은 방법 에 반환 값 을 직접 설정 하 는 방법 을 보 여 줍 니 다.[HttpPost]
void CreateTodoItem([FromBody] TodoItem item)
{
// (some code shown here)
Context.Response.StatusCode = 201;
Context.Response.Headers[""] = url;
}
이런 방법의 결함 은 단원 테스트 를 진행 하기 매우 어렵다.(테스트 관련 토론 은 Unit Testing Controllers in ASP. NET Web API 참조).
의존 주입
MVC 6 에는 의존 주입 기능 이 내장 되 어 있다.ToDo 목록 을 포함 하 는 reposcory 클래스 를 만 듭 니 다.
우선, reposcory 에 인 터 페 이 스 를 정의 합 니 다.System.Collections.Generic;
TodoApi.Models
{
ITodoRepository
{
IEnumerable<TodoItem> AllItems { ; }
void Add(TodoItem item);
TodoItem GetById(int id);
bool TryDelete(int id);
}
}
이후 구체 적 인 실현 방법 을 정의 한다.System;
System.Collections.Generic;
System.Linq;
TodoApi.Models
{
TodoRepository : ITodoRepository
{
List<TodoItem> _items = List<TodoItem>();
IEnumerable<TodoItem> AllItems
{
get
{
_items;
}
}
TodoItem GetById(int id)
{
_items.FirstOrDefault(x => x.Id == id);
}
void Add(TodoItem item)
{
item.Id = 1 + _items.Max(x => (int?)x.Id) ?? 0;
_items.Add(item);
}
bool TryDelete(int id)
{
var item = GetById(id);
(item == null)
{
;
}
_items.Remove(item);
;
}
}
}
구조 함 수 를 사용 하여 reposcory 를 contrller 에 주입 합 니 다:[Route("")]
TodoController : Controller
{
// Remove this code:
// List<TodoItem> _items = List<TodoItem>()
//{
// TodoItem { Id = 1, Title = "" }
//};
// Add this code:
ITodoRepository _repository;
TodoController(ITodoRepository repository)
{
_repository = repository;
}
그리고 controller 방법 을 reposcory 로 업데이트 합 니 다.[HttpGet]
IEnumerable<TodoItem> GetAll()
{
_repository.AllItems;
}
[HttpGet("", Name = "")]
IActionResult GetById(int id)
{
var item = _repository.GetById(id);
(item == null)
{
HttpNotFound();
}
ObjectResult(item);
}
[HttpPost]
void CreateTodoItem([FromBody] TodoItem item)
{
(!ModelState.IsValid)
{
Context.Response.StatusCode = 400;
}
else
{
_repository.Add(item);
url = Url.RouteUrl("", { id = item.Id }, Request.Scheme, Request.Host.ToUriComponent());
Context.Response.StatusCode = 201;
Context.Response.Headers[""] = url;
}
}
[HttpDelete("")]
IActionResult DeleteItem(int id)
{
(_repository.TryDelete(id))
{
HttpStatusCodeResult(204); // 201 No Content
}
else
{
HttpNotFound();
}
}
우 리 는 주입 시스템 에 의존 할 때 까지 reposcory 를 등록 해 야 작 동 할 수 있 습 니 다.Startup 클래스 에 다음 코드 를 추가 합 니 다.void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
// code
services.AddSingleton<ITodoRepository, TodoRepository>();
}
응용 프로그램 이 실 행 될 때 contrller 가 생 성 되면 framework 는 TodoRepository 를 contrller 에 자동 으로 주입 하여 전체 응용 수명 주기 에 작용 합 니 다.
IIS 외 독립 배치 응용
기본적으로 F5 를 누 르 면 IIS Express 에서 실 행 됩 니 다.도구 모음 에서 IIS Express 아이콘 을 볼 수 있 습 니 다.
ASP. NET 5.0 은 다른 서버 에 배치 할 수 있 습 니 다. 이 섹 션 에 서 는 IIS 밖에서 실행 할 수 있 는 WebListener 를 사용 합 니 다.
주의: 응용 을 IIS 에 배치 하 는 데 아직도 많은 장점 이 있 습 니 다. 예 를 들 어 안전성, 진도 관리 등 입 니 다.
procject. json 파일 에 Microsoft. AspNet. server. WebListener 패키지 추가:"": {
"": "",
"": "",
"": "",
// New:
"": ""
},
다음은 procject. json 에 다음 옵션 을 추가 합 니 다.{
// Other sections not shown
"": {
"": ""
}
}
'commands' 에는 K 가 실 행 될 때 전달 할 미리 정 의 된 명령 목록 이 포함 되 어 있 습 니 다.이 예 에서 "웹" 은 명령 이름 으로 임의의 실제 명령 이름 값 일 수 있 습 니 다.
Microsoft. AspNet. Hosting 프로그램 집합 은 ASP. NET 5.0 응용 프로그램 을 배치 하 는 데 사 용 됩 니 다.
· -- server 표 시 는 서버 를 설명 하 는 데 사 용 됩 니 다. 이 예 에서 WebListener 입 니 다.
· -- server. urls 표 시 는 감청 할 URL 을 제공 합 니 다.
procject. json 파일 저장.Solution Explorer 에서 프로젝트 를 오른쪽 클릭 하여 Properties 를 선택 하 십시오.Properties 란 에서 Debug 를 클릭 합 니 다.Debug target 에서 'IIS Express' 를' 웹 '으로 변경 합 니 다.
F5 를 누 르 면 앱 을 실행 합 니 다.Visual Studio 는 이 때 WebListener 를 시작 하 는 콘 솔 프로그램 을 실행 합 니 다.
브 라 우 저 열기, 입력http://localhost:5000。환영 창 을 볼 수 있 습 니 다.
IIS 를 사용 할 필요 가 있다 면 이전 단계 에서 Debug Target 을 'IIS Express' 로 변경 하면 된다.
이 글 은 이 시리즈 의 마지막 편 으로 여러분 의 관심 에 감 사 드 립 니 다.
원본 링크:http://www.asp.net/vnext/overview/aspnet-vnext/create-a-web-api-with-mvc-6
디 렉 터 리:
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
작업 중 문제 해결 - (win 2003 asp. net) Session 과 페이지 전송 방법 으로 해결 방안 을 정상적으로 사용 할 수 없습니다.또한 F 는 처음에 우리 의 BP & IT 프로젝트 팀 이 Forms 폼 검증 을 사용 했다 고 판단 할 수 있 습 니 다. 페이지 를 뛰 어 넘 는 것 은http://hr.bingjun.cc/MyTask/MyTas...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.