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

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

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

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



답변

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

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


답변

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

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

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

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

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

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


답변

.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}’와 같은 라우트를 리턴하여 새로 작성된 자원으로 리턴합니다.


답변