Trong phần trước, bạn đã tìm hiểu về liên kết tham số với phương thức hành động API Web. Tại đây, bạn sẽ tìm hiểu về các kiểu trả về của các phương thức hành động sẽ lần lượt được nhúng trong phản hồi API Web gửi đến máy khách.
Phương thức hành động API Web có thể có các kiểu trả về sau.
Void
Không cần thiết rằng tất cả các phương thức hành động phải trả lại một cái gì đó. Nó có thể có kiểu trả về void.
Ví dụ, hãy xem xét phương pháp hành động Xóa sau đây chỉ xóa sinh viên khỏi nguồn dữ liệu và không trả về gì.
Ví dụ: Void Return Type
Một phương thức hành động có thể trả về các kiểu phức tạp nguyên thủy hoặc tùy chỉnh khác như các phương thức bình thường khác.
Hãy xem xét các phương thức hành động sau đây.
Ví dụ: Primitive or Complex Return Type
HttpResponseMessage
Yêu cầu HTTP GET http: // localhost: xxxx / api / student? Name = john sẽ trả về phản hồi sau trong Fiddler.
controller API Web luôn trả về một đối tượng của httpResponseMessage cho cơ sở hạ tầng lưu trữ. Hình dưới đây minh họa đường ống phản hồi / yêu cầu API Web tổng thể.
Như bạn có thể thấy trong hình trên, bộ điều khiển API Web trả về đối tượng HttpResponseMessage. Bạn cũng có thể tạo và trả về một đối tượng của httpResponseMessage trực tiếp từ mộ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ể định 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 bạn.
ví dụ: Return HttpResponseMessage
Ví dụ: một 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ự, một yêu cầu HTTP GET http: // localhost: 60464 / api / student? Id = 1 sẽ nhận được phản hồi sau khi xem xét sinh viên có id = 1 tồn tại trong cơ sở dữ liệu.
IHttpActionResult
IHttpActionResult đã được giới thiệu trong API Web 2 (.NET 4.5). Một phương thức hành động trong Web API 2 có thể trả về việc triển khai lớp IHttpActionResult giống hoặc ít hơn với lớp ActionResult trong ASP.NET MVC.
Bạn có thể tạo lớp riêng của mình thực hiện IHttpActionResult hoặc sử dụng các phương thức khác nhau của lớp ApiControll trả về một đối tượng triển khai IHttpActionResult.
ví dụ: Return IHttpActionResult Type using Ok() and NotFound() Methods
Bạn có thể tạo lớp tùy chỉnh của riêng mình dưới dạng loại kết quả thực hiện giao diện IHttpActionResult.
Ví dụ sau đây cho thấy việc thực hiện lớp IHttpActionResult.
Ví dụ: Create Custom Result Type
Ví dụ: Return Custom Result Type
Phương thức hành động API Web có thể có các kiểu trả về sau.
- Void
- Primitive type or Complex type
- HttpResponseMessage
- IHttpActionResult
Void
Không cần thiết rằng tất cả các phương thức hành động phải trả lại một cái gì đó. Nó có thể có kiểu trả về void.
Ví dụ, hãy xem xét phương pháp hành động Xóa sau đây chỉ xóa sinh viên khỏi nguồn dữ liệu và không trả về gì.
Ví dụ: Void Return Type
public class StudentController : ApiControllerKiểu nguyên thủy hoặc phức tạp
{
public void Delete(int id)
{
DeleteStudentFromDB(id);
}
}
Một phương thức hành động có thể trả về các kiểu phức tạp nguyên thủy hoặc tùy chỉnh khác như các phương thức bình thường khác.
Hãy xem xét các phương thức hành động sau đây.
Ví dụ: Primitive or Complex Return Type
public class StudentNhư 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ề loại Sinh viên.
{
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;
}
}
HttpResponseMessage
Yêu cầu HTTP GET http: // localhost: xxxx / api / student? Name = john sẽ trả về phản hồi sau trong Fiddler.
controller API Web luôn trả về một đối tượng của httpResponseMessage cho cơ sở hạ tầng lưu trữ. Hình dưới đây minh họa đường ống phản hồi / yêu cầu API Web tổng thể.
Như bạn có thể thấy trong hình trên, bộ điều khiển API Web trả về đối tượng HttpResponseMessage. Bạn cũng có thể tạo và trả về một đối tượng của httpResponseMessage trực tiếp từ mộ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ể định 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 bạn.
ví dụ: Return HttpResponseMessage
public HttpResponseMessage Get(int id)Trong phương thức hành động trên, nếu không có sinh viên có id được chỉ định trong DB thì nó sẽ trả về mã trạng thái Không tìm thấy HTTP 404, nếu không, nó sẽ trả về trạng thái 200 OK với dữ liệu sinh viên.
{
Student stud = GetStudentFromDB(id);
if (stud == null) {
return Request.CreateResponse(HttpStatusCode.NotFound, id);
}
return Request.CreateResponse(HttpStatusCode.OK, stud);
}
Ví dụ: một 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ự, một yêu cầu HTTP GET http: // localhost: 60464 / api / student? Id = 1 sẽ nhận được phản hồi sau khi xem xét sinh viên có id = 1 tồn tại trong cơ sở dữ liệu.
IHttpActionResult
IHttpActionResult đã được giới thiệu trong API Web 2 (.NET 4.5). Một phương thức hành động trong Web API 2 có thể trả về việc triển khai lớp IHttpActionResult giống hoặc ít hơn với lớp ActionResult trong ASP.NET MVC.
Bạn có thể tạo lớp riêng của mình thực hiện IHttpActionResult hoặc sử dụng các phương thức khác nhau của lớp ApiControll trả về một đối tượng triển khai IHttpActionResult.
ví dụ: Return IHttpActionResult Type using Ok() and NotFound() Methods
public IHttpActionResult Get(int id)Create Custom Result Type
{
Student stud = GetStudentFromDB(id);
if (stud == null)
{
return NotFound();
}
return Ok(stud);
}
Bạn có thể tạo lớp tùy chỉnh của riêng mình dưới dạng loại kết quả thực hiện giao diện IHttpActionResult.
Ví dụ sau đây cho thấy việc thực hiện lớp IHttpActionResult.
Ví dụ: Create Custom Result Type
public class TextResult : IHttpActionResultBây giờ, bạn có thể trả về đối tượng TextResult từ phương thức hành động như bên dưới.
{
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);
}
}
Ví dụ: Return Custom Result Type
public IHttpActionResult GetName(int id)
{
string name = GetStudentName(id);
if (String.IsNullOrEmpty(name))
{
return NotFound();
}
return new TextResult(name, Request);
}