Sự khác nhau cơ bản của các chức năng đó là gì? Tất cả tôi biết là cả ba kết quả trong một 201, đó là thích hợp cho một yêu cầu POST thành công.ASP.net Core RC2 Web API POST - Khi nào sử dụng Create, CreatedAtAction, vs. CreatedAtRoute?
Tôi chỉ làm theo các ví dụ tôi thấy trực tuyến, nhưng họ không thực sự giải thích lý do tại sao họ đang làm những gì họ đang làm.
Chúng ta phải cung cấp tên cho GET của chúng tôi (1 kỷ lục bởi id):
[HttpGet("{id}", Name="MyStuff")]
public async Task<IActionResult> GetAsync(int id)
{
return new ObjectResult(new MyStuff(id));
}
mục đích của việc đặt tên này có được chức năng, bên cạnh đó nó "có lẽ" cần thiết cho chức năng POST là gì bên dưới:
[HttpPost]
public async Task<IActionResult> PostAsync([FromBody]MyStuff myStuff)
{
// actual insertion code left out
return CreatedAtRoute("MyStuff", new { id = myStuff.Id }, myStuff);
}
Tôi nhận thấy rằng CreatedAtRoute
cũng có tình trạng quá tải không có trong tên tuyến đường.
Ngoài ra còn có CreatedAtAction
có thông số tương tự. Tại sao biến thể này tồn tại?
Ngoài ra còn có Created
kỳ vọng URL và đối tượng chúng tôi muốn trả lại. Tôi có thể chỉ sử dụng biến thể này và cung cấp một URL không có thật và trả về đối tượng tôi muốn và hoàn thành nó không?
Tôi không chắc chắn tại sao có quá nhiều biến thể chỉ để có thể trả lại 201 cho khách hàng. Trong hầu hết các trường hợp, tất cả những gì tôi muốn làm là trả lại id duy nhất "có khả năng từ một cơ sở dữ liệu" hoặc một phiên bản thực thể của tôi có thông tin tối thiểu. Tôi nghĩ rằng cuối cùng, một phản ứng 201 "nên" tạo ra một tiêu đề vị trí có URL của tài nguyên mới được tạo ra, mà tôi tin rằng tất cả 3 và quá tải của họ kết thúc lên làm. Tại sao tôi luôn nên trả lại tiêu đề vị trí? Ứng dụng JavaScript, ứng dụng gốc dành cho thiết bị di động và máy tính để bàn của tôi không bao giờ sử dụng nó. Ví dụ: nếu tôi phát hành HTTP POST, để tạo báo cáo thanh toán và gửi chúng cho người dùng, URL vị trí như vậy sẽ là gì? (Xin lỗi vì tôi không tìm hiểu sâu hơn về lịch sử Internet để tìm câu trả lời cho điều này.)
Tại sao tạo tên cho hành động và tuyến đường? Sự khác biệt giữa tên hành động và tên tuyến đường là gì?
Tôi đang bối rối về điều này, vì vậy tôi đã sử dụng để trả lại Ok()
, trả về 200, không phù hợp cho POST.
Tôi không chắc chắn về .NET Core, nhưng phương thức 'Nội dung (HttpStatusCode, T content)' vẫn tồn tại để trả lại cả mã trạng thái và nội dung? Điều đó sẽ cho phép trả về 201 cùng với đối tượng mới được tạo, mà không bao gồm tiêu đề 'Location'. –
afrazier
Quá tải đó dường như không tồn tại nữa, nhưng thực sự có quá tải cho StatusCode mà bạn có thể sử dụng tương tự: 'StatusCode (int httpStatusCode, giá trị đối tượng)' – Sock
Dường như '[HttpGet (" {id} " , Tên = "GetUser", thứ tự = 0)] 'cách tạo một tuyến đường không xuất hiện để làm việc với CreatedAtRoute() – Crob