Phiên bản cơ bản nhất đáp ứng với a JsonResult
là:
// GET: api/authors
[HttpGet]
public JsonResult Get()
{
return Json(_authorRepository.List());
}
Tuy nhiên, điều này sẽ không giúp ích cho vấn đề của bạn vì bạn không thể giải quyết rõ ràng với mã phản hồi của chính mình.
Cách để có quyền kiểm soát kết quả trạng thái, là bạn cần trả về một ActionResult
nơi mà sau đó bạn có thể tận dụng lợi thế của StatusCodeResult
loại.
ví dụ:
// GET: api/authors/search?namelike=foo
[HttpGet("Search")]
public IActionResult Search(string namelike)
{
var result = _authorRepository.GetByNameSubstring(namelike);
if (!result.Any())
{
return NotFound(namelike);
}
return Ok(result);
}
Lưu ý cả hai ví dụ trên đến từ một hướng dẫn tuyệt vời có sẵn từ Tài liệu của Microsoft: Định dạng dữ liệu phản hồi
Thêm thứ
Vấn đề tôi gặp phải khá thường xuyên là tôi muốn có nhiều quyền kiểm soát chi tiết hơn đối với WebAPI của mình thay vì chỉ đi với cấu hình mặc định từ mẫu "Dự án mới" trong VS.
Hãy chắc chắn rằng bạn có một số điều cơ bản ...
Bước 1: Định cấu hình Dịch vụ của bạn
Để làm cho ASP.NET Core WebAPI của bạn phản hồi với Đối tượng được tuần tự hóa JSON cùng với toàn quyền kiểm soát mã trạng thái, bạn nên bắt đầu bằng cách đảm bảo rằng bạn đã bao gồm AddMvc()
dịch vụ trong ConfigureServices
phương thức của bạn thường được tìm thấy Startup.cs
.
Điều quan trọng cần lưu ý là AddMvc()
sẽ tự động bao gồm Trình định dạng đầu vào / đầu ra cho JSON cùng với việc trả lời các loại yêu cầu khác.
Nếu dự án của bạn yêu cầu toàn quyền kiểm soát và bạn muốn xác định nghiêm ngặt các dịch vụ của mình, chẳng hạn như cách WebAPI của bạn sẽ hoạt động với các loại yêu cầu khác nhau bao gồm application/json
và không đáp ứng với các loại yêu cầu khác (như yêu cầu trình duyệt tiêu chuẩn), bạn có thể xác định thủ công với mã sau:
public void ConfigureServices(IServiceCollection services)
{
// Build a customized MVC implementation, without using the default AddMvc(), instead use AddMvcCore().
// https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc/MvcServiceCollectionExtensions.cs
services
.AddMvcCore(options =>
{
options.RequireHttpsPermanent = true; // does not affect api requests
options.RespectBrowserAcceptHeader = true; // false by default
//options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
//remove these two below, but added so you know where to place them...
options.OutputFormatters.Add(new YourCustomOutputFormatter());
options.InputFormatters.Add(new YourCustomInputFormatter());
})
//.AddApiExplorer()
//.AddAuthorization()
.AddFormatterMappings()
//.AddCacheTagHelper()
//.AddDataAnnotations()
//.AddCors()
.AddJsonFormatters(); // JSON, or you can build your own custom one (above)
}
Bạn sẽ nhận thấy rằng tôi cũng đã bao gồm một cách để bạn thêm các trình định dạng Đầu vào / Đầu ra tùy chỉnh của riêng bạn, trong trường hợp bạn có thể muốn phản hồi với định dạng tuần tự hóa khác (protobuf, tiết kiệm, v.v.).
Đoạn mã ở trên hầu hết là một bản sao của AddMvc()
phương thức. Tuy nhiên, chúng tôi tự thực hiện từng dịch vụ "mặc định" bằng cách xác định từng dịch vụ thay vì đi với dịch vụ được vận chuyển trước với mẫu. Tôi đã thêm liên kết kho lưu trữ trong khối mã hoặc bạn có thể kiểm tra AddMvc()
từ kho GitHub. .
Lưu ý rằng có một số hướng dẫn sẽ cố gắng giải quyết vấn đề này bằng cách "hoàn tác" các mặc định, thay vì không triển khai nó ngay từ đầu ... Nếu bạn cho rằng chúng tôi hiện đang làm việc với Nguồn mở, thì đây là công việc dư thừa , mã xấu và thẳng thắn một thói quen cũ sẽ sớm biến mất.
Bước 2: Tạo Trình điều khiển
Tôi sẽ cho bạn thấy một câu hỏi thực sự đơn giản chỉ để sắp xếp câu hỏi của bạn.
public class FooController
{
[HttpPost]
public async Task<IActionResult> Create([FromBody] Object item)
{
if (item == null) return BadRequest();
var newItem = new Object(); // create the object to return
if (newItem != null) return Ok(newItem);
else return NotFound();
}
}
Bước 3: Kiểm tra Content-Type
vàAccept
Bạn cần đảm bảo rằng các tiêu đề Content-Type
và yêu cầuAccept
của bạn được đặt đúng. Trong trường hợp của bạn (JSON), bạn sẽ muốn thiết lập nó thành .application/json
Nếu bạn muốn WebAPI của bạn trả lời dưới dạng JSON như mặc định, bất kể tiêu đề yêu cầu đang chỉ định bạn có thể làm điều đó theo một vài cách .
Cách 1
Như được hiển thị trong bài viết tôi đã đề xuất trước đó ( Định dạng dữ liệu phản hồi ), bạn có thể buộc một định dạng cụ thể ở cấp Bộ điều khiển / Hành động. Cá nhân tôi không thích cách tiếp cận này ... nhưng ở đây nó là hoàn chỉnh:
Buộc một định dạng cụ thể Nếu bạn muốn hạn chế các định dạng phản hồi cho một hành động cụ thể bạn có thể, bạn có thể áp dụng bộ lọc [Sản xuất]. Bộ lọc [Sản xuất] chỉ định các định dạng phản hồi cho một hành động cụ thể (hoặc bộ điều khiển). Giống như hầu hết các Bộ lọc, điều này có thể được áp dụng ở hành động, bộ điều khiển hoặc phạm vi toàn cầu.
[Produces("application/json")]
public class AuthorsController
Bộ [Produces]
lọc sẽ buộc tất cả các hành động trong các
AuthorsController
phản hồi được định dạng JSON, ngay cả khi các trình định dạng khác được định cấu hình cho ứng dụng và máy khách cung cấp một Accept
tiêu đề yêu cầu một định dạng khác, có sẵn.
Cách 2
Phương pháp ưa thích của tôi là để WebAPI đáp ứng tất cả các yêu cầu với định dạng được yêu cầu. Tuy nhiên, trong trường hợp nó không chấp nhận định dạng được yêu cầu, thì hãy quay lại mặc định (ví dụ: JSON)
Trước tiên, bạn sẽ cần phải đăng ký trong tùy chọn của mình (chúng tôi cần làm lại hành vi mặc định, như đã lưu ý trước đó)
options.RespectBrowserAcceptHeader = true; // false by default
Cuối cùng, bằng cách đơn giản sắp xếp lại danh sách các trình định dạng được xác định trong trình xây dựng dịch vụ, máy chủ web sẽ mặc định cho trình định dạng bạn định vị ở đầu danh sách (ví dụ vị trí 0).
Thông tin thêm có thể được tìm thấy trong mục Công cụ và Phát triển Web .NET này
CreatedAtRoute
phương thức, v.v.