ASP.NET Web API - Phương thức hành động Kiểu trả về

Kiểu trả về của phương thức hành động


Trong phần trước, bạn đã tìm hiểu về ràng buộc tham số với phương thức hành động của Web API. Ở đây, bạn sẽ tìm hiểu về các kiểu trả về của phương thức hành động, sau đó sẽ được nhúng vào phản hồi của Web API được gửi đến máy khách.

Phương thức hành động của Web API có thể có các kiểu trả về sau.

  1. Void
  2. Kiểu nguyên thủy hoặc Kiểu phức tạp
  3. HttpResponseMessage
  4. IHttpActionResult

Void 

Không nhất thiết tất cả các phương thức hành động phải trả về một cái gì đó. Nó có thể có kiểu trả về void.

Ví dụ, hãy xem xét phương thức hành động Delete sau đây chỉ xóa học sinh khỏi nguồn dữ liệu và không trả về gì cả.

Ví dụ: Kiểu trả về Void

public class StudentController : ApiController
{
    public void Delete(int id)
    {
        DeleteStudentFromDB(id);
    }
}

Như bạn có thể thấy ở trên, phương thức hành động Delete trả về void. Nó sẽ gửi mã trạng thái 204 "No Content" dưới dạng phản hồi khi bạn gửi yêu cầu HTTP DELETE như hiển thị bên dưới.


Kiểu cơ sở hoặc phức hợp


Một phương thức hành động có thể trả về kiểu cơ sở hoặc kiểu phức hợp tùy chỉnh khác như các phương thức bình thường khác.

Hãy xem các phương thức hành động Get sau đây.

Ví dụ: Kiểu trả về cơ sở hoặc phức tạp

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class StudentController : ApiController
{
    public int GetId(string name)
    {
        int id = GetStudentId(name);
    
        return id;
    }

    public Student GetStudent(int id)
    {
        var student = GetStudentFromDB(id);
    
        return student;
    }
}

Như bạn có thể thấy ở trên, phương thức hành động GetId trả về một số nguyên và phương thức hành động GetStudent trả về một kiểu Student.

Yêu cầu HTTP GET http://localhost:xxxx/api/student?name=john sẽ trả về phản hồi sau trong Fiddler.

Yêu cầu HTTP GET http://localhost:xxxx/api/student?id=1 sẽ trả về phản hồi sau trong Fiddler.

HttpResponseMessage


Bộ điều khiển Web API luôn trả về đối tượng HttpResponseMessage cho cơ sở hạ tầng lưu trữ.

Truy cập Web API HTTP Message Life Cycle Poster để biết thêm chi tiết.

Như bạn có thể thấy trong hình trên, bộ điều khiển Web API trả về đối tượng HttpResponseMessage. Bạn cũng có thể tạo và trả về đối tượng HttpResponseMessage trực tiếp từ phương thức hành động.

Ưu điểm của việc gửi HttpResponseMessage từ phương thức hành động là bạn có thể cấu hình phản hồi theo cách của mình. Bạn có thể đặt mã trạng thái, nội dung hoặc thông báo lỗi (nếu có) theo yêu cầu của mình.

Ví dụ: Trả về HttpResponseMessage

public HttpResponseMessage Get(int id)
{
    Student stud = GetStudentFromDB(id); 

    if (stud == null) {
        return Request.CreateResponse(HttpStatusCode.NotFound, id);
    }

    return Request.CreateResponse(HttpStatusCode.OK, stud);
}  

Trong phương thức hành động trên, nếu không có sinh viên nào có id được chỉ định trong DB thì nó sẽ trả về mã trạng thái HTTP 404 Not Found, nếu không, nó sẽ trả về trạng thái 200 OK với dữ liệu sinh viên.

Ví dụ, yêu cầu http GET http://localhost:xxxx/api/student?id=100 sẽ nhận được phản hồi sau khi xem xét sinh viên có id=100 không tồn tại trong DB.

Tương tự như vậy, yêu cầu HTTP GET http://localhost:60464/api/student?id=1 sẽ nhận được phản hồi sau khi xét đến việc tồn tại sinh viên có id=1 trong cơ sở dữ liệu.

IHttpActionResult


IHttpActionResult được giới thiệu trong Web API 2 (.NET 4.5). Một phương thức hành động trong Web API 2 có thể trả về một triển khai của lớp IHttpActionResult, ít nhiều giống với lớp ActionResult trong ASP.NET MVC.

Bạn có thể tạo lớp của riêng mình để triển khai IHttpActionResult hoặc sử dụng nhiều phương thức khác nhau của lớp ApiController để trả về một đối tượng triển khai IHttpActionResult.

Ví dụ: Trả về Kiểu IHttpActionResult bằng cách sử dụng Phương thức Ok() và NotFound()

public IHttpActionResult Get(int id)
{
    Student stud = GetStudentFromDB(id);
            
    if (stud == null)
    {
        return NotFound();
    }

    return Ok(stud);
}

Trong ví dụ trên, nếu sinh viên có id được chỉ định không tồn tại trong cơ sở dữ liệu thì nó sẽ trả về phản hồi với mã trạng thái 404, nếu không, nó sẽ gửi dữ liệu sinh viên với mã trạng thái 200 dưới dạng phản hồi. Như bạn thấy, chúng ta không cần phải viết nhiều mã vì phương thức NotFound() và Ok() sẽ thực hiện tất cả cho chúng ta.

Bảng sau đây liệt kê tất cả các phương thức của lớp ApiController trả về đối tượng của lớp triển khai giao diện IHttpActionResult.

 

ApiController Method Description
BadRequest() Creates a BadRequestResult object with status code 400.
Conflict() Creates a ConflictResult object with status code 409.
Content() Creates a NegotiatedContentResult with the specified status code and data.
Created() Creates a CreatedNegotiatedContentResult with status code 201 Created.
CreatedAtRoute() Creates a CreatedAtRouteNegotiatedContentResult with status code 201 created.
InternalServerError() Creates an InternalServerErrorResult with status code 500 Internal server error.
NotFound() Creates a NotFoundResult with status code404.
Ok() Creates an OkResult with status code 200.
Redirect() Creates a RedirectResult with status code 302.
RedirectToRoute() Creates a RedirectToRouteResult with status code 302.
ResponseMessage() Creates a ResponseMessageResult with the specified HttpResponseMessage.
StatusCode() Creates a StatusCodeResult with the specified http status code.
Unauthorized() Creates an UnauthorizedResult with status code 401.

Truy cập MSDN để biết tất cả các thành viên của ApiController

Tạo Kiểu Kết quả Tùy chỉnh


Bạn có thể tạo lớp tùy chỉnh của riêng mình làm kiểu kết quả triển khai giao diện IHttpActionResult.

Ví dụ sau đây minh họa cách triển khai lớp IHttpActionResult.

Ví dụ: Tạo loại kết quả tùy chỉnh

public class TextResult : IHttpActionResult
{
    string _value;
    HttpRequestMessage _request;

    public TextResult(string value, HttpRequestMessage request)
    {
        _value = value;
        _request = request;
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = new HttpResponseMessage()
        {
            Content = new StringContent(_value),
            RequestMessage = _request
        };
        return Task.FromResult(response);
    }
}

Bây giờ, bạn có thể trả về đối tượng TextResult từ phương thức hành động như hiển thị bên dưới.

Ví dụ: Trả về loại kết quả tùy chỉnh

public IHttpActionResult GetName(int id)
{
    string name = GetStudentName(id);
            
    if (String.IsNullOrEmpty(name))
    {
        return NotFound();
    }
            
    return new TextResult(name, Request);
}