Bất cứ ai có thể giải thích cho createdAtRoute () cho tôi?


136

Từ mẫu cho API Web 2, một phương thức đăng luôn như thế này:

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

Tôi không hiểu CreatedAtRoute()phương pháp này . Bất cứ ai có thể giải thích CreatedAtRoute()phương pháp cho tôi?


24
@JohnSaunders tất nhiên tôi đã tìm thấy những kết quả Google đó. Vấn đề của tôi là những tài liệu này không giúp tôi hiểu phương pháp này, sau khi đọc chúng, tôi vẫn không hiểu. Đó là lý do tại sao tôi hỏi ở đây.

11
Tôi không trả lời câu hỏi của tôi.
võ thuật

12
Nếu tôi có thể Google và tìm câu trả lời, tại sao tôi lại bận tâm dành thời gian để chỉnh sửa câu hỏi và hỏi ở đây?
võ thuật

3
cảm ơn vì đã hỏi câu hỏi này :)
Vidar

Câu trả lời:


157

Các CreatedAtRoutephương pháp được thiết kế để trả về một URI đến tài nguyên mới được tạo ra khi bạn gọi một phương thức POST để lưu trữ một số đối tượng mới. Vì vậy, nếu bạn ĐĂNG một mục đơn hàng chẳng hạn, bạn có thể trả về một tuyến đường như 'api / order / 11' (rõ ràng là 11 id của đơn đặt hàng).

BTW Tôi đồng ý rằng bài viết MSDN không có ích trong việc hiểu điều này. Lộ trình bạn thực sự quay lại sẽ tự nhiên phụ thuộc vào thiết lập định tuyến của bạn.


13
Những gì nó trả về thực sự là một đối tượng createdAtRouteNegotiatedContentResult <myObject>! Đó là những gì bạn sẽ thấy nếu bạn chạy thử nghiệm đơn vị về hành động của mình. Tuy nhiên, khi chạy trong ngữ cảnh của http, nó sẽ trả về đối tượng được tuần tự hóa trong phần thân, nhưng bạn sẽ thấy một tiêu đề trong phản hồi với liên kết đến tài nguyên. BTW nếu bạn nghĩ tôi đã trả lời câu hỏi, bạn có thể đánh dấu là câu trả lời không? Chúc mừng.
xem sắc nét hơn

3
Cảm ơn bạn, điều này trả lời câu hỏi của tôi.

2
Tuyến đường mà bạn cung cấp xuất hiện dưới dạng tiêu đề Vị trí trong phản hồi. Đây là hành vi REST khá điển hình
Jeff Martin

4
@seesharper Khi MyObject không được trả về NHƯNG ... tại sao tôi phải chuyển nó tới createdAtRoute? Phương pháp làm với nó là gì?
Elisabeth

6
Có cách nào để sử dụng tuyến đường hiện tại? Ví dụ: nếu tôi tạo một đối tượng trong bộ điều khiển tệp bằng cách sử dụng [Route("[controller]")]trên bộ điều khiển, tôi sẽ trả về cái gì (để hành động GET liền kề có thể được gọi bằng URL chẳng hạn)?
Shimmy Weitzhandler

17

Khi bạn sử dụng createdAtRoute, đối số đầu tiên là tên phương thức của Get to the resource. Thủ thuật không quá rõ ràng là, ngay cả với tên phương thức chính xác được chỉ định, bạn phải sử dụng tên param trên thuộc tính HttpGet để nó hoạt động.

Vì vậy, nếu lợi nhuận trong Bài viết của bạn là thế này:

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

Sau đó, thuộc tính phương thức Get của bạn sẽ trông như thế này ngay cả khi phương thức của bạn có tên là Get:

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

Các cuộc gọi đến phương thức Post của bạn sẽ không chỉ trả về đối tượng mới (thông thường là JSON), nó sẽ đặt tiêu đề Vị trí trên phản hồi cho URI sẽ nhận tài nguyên đó.


"Điều này sẽ không chỉ trả về đối tượng mới (thông thường là JSON), nó sẽ đặt tiêu đề Vị trí trên phản hồi cho URI sẽ nhận tài nguyên đó." Theo "Điều này", bạn có nghĩa là httpGet hoặc HttpPost? Ngoài ra, ý của bạn là "nó sẽ đặt tiêu đề Vị trí trên phản hồi cho URI sẽ nhận tài nguyên đó."?
Trần Anh Minh

"Điều này" đã đề cập đến phương pháp HttpPost (chỉnh sửa câu trả lời). Đối với câu hỏi của bạn liên quan đến tiêu đề Vị trí, đó là Tiêu đề http mà khách hàng có thể quyết định làm một cái gì đó giống như tự động chuyển hướng đến nó. Đó là Tiêu đề Phản hồi http tiêu chuẩn ( en.wikipedia.org/wiki/ .).
Scott Blasingame

Xin vui lòng bạn có thể cập nhật câu trả lời của bạn để bao gồm cả ý nghĩa của thông số thứ 2 và thứ 3.
biến

0

Trong WebAPI lõi .net, bạn sử dụng phương thức này để trả về mã 201, có nghĩa là đối tượng đã được tạo.

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

Như bạn có thể thấy ở trên, createdAtRoute có thể nhận được 3 tham số:

routeName là tên mà bạn phải đặt cho phương thức sẽ là URI sẽ lấy tài nguyên đó sau khi được tạo.

routeValues Đó là đối tượng chứa các giá trị sẽ được truyền cho phương thức GET tại tuyến đã đặt tên. Nó sẽ được sử dụng để trả về đối tượng đã tạo

nội dung Đó là đối tượng đã được tạo.

Ví dụ trên cho thấy việc thực hiện hai phương thức của bộ điều khiển đơn giản với phương thức GET đơn giản với tên ngoại quan và phương thức POST tạo ra một đối tượng mới.

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);

        }


    }
}

QUAN TRỌNG

  1. Lưu ý rằng tham số đầu tiên tại createdAtRoute (routeName), phải giống nhau theo định nghĩa của Tên tại phương thức Get.

  2. Đối tượng trên tham số thứ hai sẽ cần phải có các trường cần thiết mà bạn sử dụng để truy xuất tài nguyên trên phương thức Get, bạn có thể nói rằng đó là một tập hợp con của chính đối tượng được tạo

  3. Tham số cuối cùng là đối tượng công ty nhận được trong yêu cầu cơ thể ở dạng đầy đủ.

CUỐI CÙNG

Kết quả cuối cùng, khi Bài đăng để tạo một công ty mới được tạo cho API này, bạn sẽ trả lại một tuyến đường như 'api / company / {id}' sẽ trả lại cho bạn tài nguyên mới được tạo

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.