누구든지 CreatedAtRoute ()를 설명 할 수 있습니까?


136

Web API 2 용 템플릿에서 게시 방법은 항상 다음과 같습니다.

[ResponseType(typeof(MyDTO))]
public IHttpActionResult PostmyObject(MyDTO myObject)
{
    ...
    return CreatedAtRoute("DefaultApi", new { id = myObject.Id }, myObject);
}

CreatedAtRoute()방법을 이해하지 못합니다 . 누구든지 CreatedAtRoute()나에게 방법을 설명 할 수 있습니까 ?


25
@JohnSaunders는 물론 Google 검색 결과를 찾았습니다. 내 문제는이 문서 가이 방법을 이해하는 데 도움이되지 않는다는 것입니다. 문서를 읽은 후에도 여전히 이해할 수 없습니다. 그래서 여기에 묻습니다.
무술

11
나는 당신이 내 질문에 대답하지 않습니다.
무술

12
Google에서 답변을 찾을 수있는 경우 왜 질문을 수정하고 여기에 질문하는 데 시간이 걸리나요?
무술

3
이 질문을 해 주셔서 감사합니다 :)
Vidar

답변:


157

CreatedAtRoute메소드는 일부 새 오브젝트를 저장하기 위해 POST 메소드를 호출 할 때 새로 작성된 자원에 URI를 리턴하기위한 것입니다. 예를 들어 주문 항목을 POST하면 'api / order / 11'과 같은 경로를 반환 할 수 있습니다 (11은 분명히 주문의 ID 임).

BTW 본인은 MSDN 기사가이를 이해하는 데 아무런 소용이 없음에 동의합니다. 실제로 돌아 오는 경로는 라우팅 설정에 따라 달라집니다.


13
반환되는 것은 실제로 CreatedAtRouteNegotiatedContentResult <myObject> 객체입니다! 그것은 당신이 당신의 행동에 대해 단위 테스트를 실행하면 볼 수 있습니다. 그러나 http 컨텍스트에서 실행하면 본문에 직렬화 된 객체가 반환되지만 응답에 리소스 링크가 포함 된 헤더가 표시됩니다. BTW 질문에 답변했다고 생각되면 답변으로 표시 할 수 있습니까? 건배.
더 선명한

3
고마워요, 이것은 내 질문에 대답합니다.
무술

2
제공 한 경로가 응답에 위치 헤더로 나타납니다. 이것은 상당히 전형적인 REST 동작입니다
Jeff Martin

4
@seesharper MyObject가 반환되지 않은 경우 ... 왜 CreatedAtRoute에 전달해야합니까? 그 방법은 무엇입니까?
엘리자베스

6
현재 경로를 사용하는 방법이 있습니까? 예를 들어 [Route("[controller]")]on 컨트롤러를 사용하여 파일 컨트롤러에 객체를 만들면 무엇을 반환합니까 (예를 들어 인접한 GET 작업을 URL로 호출 할 수 있습니까)?
Shimmy Weitzhandler

17

CreatedAtRoute를 사용할 때 첫 번째 인수는 리소스로 가져 오기의 메서드 이름입니다. 명확하지 않은 요령은 올바른 메소드 이름을 지정하더라도 HttpGet 속성에서 Name 매개 변수를 사용하여 작동해야한다는 것입니다.

따라서 게시물의 반품이 다음과 같은 경우 :

return CreatedAtRoute("Get", new { newModel.Id}, newModel);

그런 다음 메소드의 이름이 Get 인 경우에도 Get 메소드 속성은 다음과 같아야합니다.

[HttpGet("{id}", Name = "Get")]

Post 메서드를 호출하면 새 객체 (일반적으로 JSON)가 반환 될뿐만 아니라 해당 리소스를 가져 오는 URI에 대한 응답의 Location 헤더가 설정됩니다.


"이것은 새로운 객체 (일반적으로 JSON)를 반환 할뿐만 아니라 해당 리소스를 얻을 URI에 대한 응답에 Location 헤더를 설정합니다." "This"는 HttpGet 또는 HttpPost를 의미합니까? 또한 "자원을 가져올 URI에 대한 응답에서 Location 헤더를 설정합니다"라는 의미는 무엇입니까?
Tran Anh Minh

"This"는 HttpPost 메소드를 참조했습니다 (답을 편집하십시오). Location 헤더에 대한 귀하의 질문에 관해서는 클라이언트가 자동으로 리디렉션하는 것과 같이 무언가를하기로 결정할 수있는 HTTP 헤더입니다. 표준 Http Response Header ( en.wikipedia.org/wiki/… )입니다.
Scott Blasingame

두 번째 및 세 번째 매개 변수의 의미를 포함하도록 답변을 업데이트 할 수 있습니다.
변수

0

.net 코어 WebAPI에서이 메소드를 사용하여 201 코드를 리턴합니다. 이는 오브젝트가 작성되었음을 의미합니다.

[Microsoft.AspNetCore.Mvc.NonAction]
public virtual Microsoft.AspNetCore.Mvc.CreatedAtRouteResult CreatedAtRoute (string routeName, object routeValues, object content);

위에서 볼 수 있듯이 CreatedAtRoute는 3 개의 매개 변수를받을 수 있습니다.

routeName 생성 후 해당 리소스를 가져 오는 URI가 될 메서드에 입력해야하는 이름입니다.

routeValues 명명 된 경로에서 GET 메소드로 전달 될 값을 포함하는 객체입니다. 생성 된 객체를 반환하는 데 사용됩니다

content 만들어진 객체입니다.

위의 예제는 결합 된 이름을 가진 간단한 GET 메소드와 새 오브젝트를 작성하는 POST 메소드를 사용하여 간단한 제어기의 두 가지 메소드 구현을 보여줍니다.

namespace BastterAPI.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class CompanyController : Controller
    {
        private ICompanyRepository _companyRepository;

        public CompanyController(ICompanyRepository companyRepository)
        {
            _companyRepository = companyRepository;
        }

        [HttpGet("{id}", Name="GetCompany")]
        public IActionResult GetById(int id)
        {
            Company company = _companyRepository.Find(id);

            if (company == null)
            {
                return NotFound();
            }

            return new ObjectResult(company);

        }

        [HttpPost]
        public IActionResult Create([FromBody] Company company)
        {

            if (company == null)
            {
                return BadRequest();
            }

            _companyRepository.Add(company);

            return CreatedAtRoute("GetCompany", new Company { CompanyID = company.CompanyID }, company);

        }


    }
}

중대한

  1. CreatedAtRoute (routeName)의 첫 번째 매개 변수는 Get 메서드의 Name 정의에서 동일해야합니다.

  2. 두 번째 매개 변수의 개체에는 Get 메서드에서 리소스를 검색하는 데 사용되는 필수 필드가 있어야합니다.이 필드는 자체 생성 된 개체의 하위 집합이라고 말할 수 있습니다.

  3. 마지막 매개 변수는 본문 요청에서 전체 양식으로받은 회사 오브젝트입니다.

마지막으로

최종적으로 새 회사를 작성하기위한 Post가이 API에 작성되면 'api / company / {id}'와 같은 라우트를 리턴하여 새로 작성된 자원으로 리턴합니다.

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