ASP.NET Web API - Liên kết tham số
Liên kết tham số trong ASP.NET Web API
Trong phần trước, chúng ta đã tìm hiểu cách Web API định tuyến yêu cầu HTTP đến bộ điều khiển và phương thức hành động. Ở đây, chúng ta sẽ tìm hiểu cách Web API liên kết dữ liệu yêu cầu HTTP với các tham số của phương thức hành động.
Các phương thức hành động trong bộ điều khiển Web API có thể có một hoặc nhiều tham số thuộc các kiểu khác nhau. Có thể là kiểu nguyên thủy hoặc kiểu phức hợp. Web API liên kết các tham số phương thức hành động với chuỗi truy vấn của URL hoặc với nội dung yêu cầu tùy thuộc vào kiểu tham số.
Theo mặc định, nếu kiểu tham số là kiểu nguyên thủy .NET như int, bool, double, string, GUID, DateTime, decimal hoặc bất kỳ kiểu nào khác có thể chuyển đổi từ kiểu chuỗi, thì nó sẽ đặt giá trị của tham số từ chuỗi truy vấn. Và nếu kiểu tham số là kiểu phức hợp, thì Web API sẽ cố gắng lấy giá trị từ nội dung yêu cầu theo mặc định.
Bảng sau liệt kê các quy tắc mặc định để liên kết tham số.
HTTP Method | Query String | Request Body |
---|---|---|
GET | Primitive Type, Complex Type |
NA |
POST | Primitive Type | Complex Type |
PUT | Primitive Type | Complex Type |
PATCH | Primitive Type | Complex Type |
DELETE | Primitive Type, Complex Type |
NA |
Hãy cùng xem Web API lấy giá trị của tham số phương thức hành động từ yêu cầu HTTP như thế nào.
Lấy phương thức hành động với tham số nguyên thủy
Hãy xem xét ví dụ sau về phương thức hành động GET bao gồm một tham số kiểu nguyên thủy duy nhất.
Ví dụ: Liên kết tham số nguyên thủy
public class StudentController : ApiController
{
public Student Get(int id)
{
}
}
Như bạn có thể thấy, phương thức hành động HTTP GET ở trên bao gồm tham số id của kiểu int. Vì vậy, Web API sẽ cố gắng trích xuất giá trị của id từ chuỗi truy vấn của URL được yêu cầu, chuyển đổi nó thành int và gán nó cho tham số id của phương thức hành động GET. Ví dụ, nếu yêu cầu HTTP là http://localhost/api/student?id=1 thì giá trị của tham số id sẽ là 1.
Sau đây là các Yêu cầu HTTP GET hợp lệ cho phương thức hành động ở trên.
http://localhost/api/student?id=1
http://localhost/api/student?ID=1
Nhiều tham số nguyên thủy
Hãy xem ví dụ sau về phương thức hành động GET có nhiều tham số cơ sở.
public class StudentController : ApiController
{
public Student Get(int id, string name)
{
}
}
Như bạn có thể thấy ở trên, phương thức HTTP GET bao gồm nhiều tham số kiểu cơ sở. Vì vậy, Web API sẽ cố gắng trích xuất các giá trị từ chuỗi truy vấn của URL được yêu cầu. Ví dụ: nếu yêu cầu HTTP là http://localhost/api/student?id=1&name=steve, thì giá trị của tham số id sẽ là 1 và tham số name sẽ là "steve".
Sau đây là các Yêu cầu HTTP GET hợp lệ cho phương thức hành động ở trên.
http://localhost/api/student?id=1&name=steve
http://localhost/api/student?ID=1&NAME=steve
http://localhost/api/student?name=steve&id=1
Phương thức hành động POST với tham số cơ sở
Yêu cầu HTTP POST được sử dụng để tạo một tài nguyên mới. Nó có thể bao gồm dữ liệu yêu cầu vào phần thân yêu cầu HTTP và cũng có trong chuỗi truy vấn.
Hãy xem phương thức hành động Post sau.
Ví dụ: Phương thức Post với tham số cơ sở
public class StudentController : ApiController
{
public Student Post(id id, string name)
{
}
}
Như bạn có thể thấy ở trên, phương thức hành động Post() bao gồm các tham số kiểu cơ sở là id và name. Vì vậy, theo mặc định, Web API sẽ lấy các giá trị từ chuỗi truy vấn. Ví dụ, nếu yêu cầu HTTP POST là http://localhost/api/student?id=1&name=steve, thì giá trị của tham số id sẽ là 1 và tham số name sẽ là "steve" trong phương thức Post() ở trên.
Bây giờ, hãy xem xét phương thức Post() sau với tham số kiểu phức hợp.
Ví dụ: Phương thức Post với tham số kiểu phức tạp
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
}
public class StudentController : ApiController
{
public Student Post(Student stud)
{
}
}
Phương thức Post() ở trên bao gồm tham số kiểu Student. Vì vậy, theo quy tắc mặc định, Web API sẽ cố gắng lấy các giá trị của tham số stud từ thân yêu cầu HTTP.
Sau đây là yêu cầu HTTP POST hợp lệ trong fiddler cho phương thức hành động ở trên.
Web API sẽ trích xuất đối tượng JSON từ thân yêu cầu HTTP ở trên và tự động chuyển đổi thành đối tượng Student vì tên của các thuộc tính của đối tượng JSON khớp với tên của các thuộc tính lớp Student (không phân biệt chữ hoa chữ thường).
Phương thức POST với các tham số hỗn hợp
Các phương thức hành động HTTP Post có thể bao gồm các tham số kiểu cơ sở và phức hợp. Hãy xem xét ví dụ sau.
Ví dụ: Phương thức Post với các tham số kiểu cơ sở và phức tạp
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
}
public class StudentController : ApiController
{
public Student Post(int age, Student student)
{
}
}
Phương thức Post ở trên bao gồm cả tham số kiểu cơ sở và phức hợp. Vì vậy, theo mặc định, Web API sẽ lấy tham số age từ chuỗi truy vấn và tham số student từ thân yêu cầu.
Sau đây là yêu cầu HTTP POST hợp lệ trong fiddler cho phương thức hành động ở trên.
Ràng buộc tham số cho phương thức Put và Patch sẽ giống như phương thức POST trong Web API.
[FromUri] và [FromBody]
Bạn đã thấy rằng theo mặc định, ASP.NET Web API lấy giá trị của tham số nguyên thủy từ chuỗi truy vấn và tham số kiểu phức tạp từ nội dung yêu cầu. Nhưng, nếu chúng ta muốn thay đổi hành vi mặc định này thì sao?
Sử dụng thuộc tính [FromUri] để buộc Web API lấy giá trị của kiểu phức tạp từ chuỗi truy vấn và thuộc tính [FromBody] để lấy giá trị của kiểu nguyên thủy từ nội dung yêu cầu, ngược lại với các quy tắc mặc định.
Ví dụ, hãy xem phương thức GET sau.
Ví dụ: FormUri
public class StudentController : ApiController
{
public Student Get([FromUri] Student stud)
{
}
}
Trong ví dụ trên, phương thức Get() bao gồm một tham số kiểu phức tạp với thuộc tính [FromUri]. Vì vậy, Web API sẽ cố gắng lấy giá trị của tham số kiểu Student từ chuỗi truy vấn. Ví dụ, nếu một yêu cầu HTTP GET http://localhost:xxxx/api/student?id=1&name=steve thì Web API sẽ tạo một đối tượng kiểu Student và đặt các giá trị thuộc tính id và name của nó thành giá trị của tham số chuỗi truy vấn id và name.
public class StudentController : ApiController
{
public Student Get([FromUri] Student stud)
{
}
}
Như bạn có thể thấy ở trên, chúng tôi đã áp dụng thuộc tính [FromUri] với tham số Student. Theo mặc định, Web API trích xuất giá trị của kiểu phức hợp từ thân yêu cầu, nhưng ở đây, chúng tôi đã áp dụng thuộc tính [FromUri]. Vì vậy, bây giờ, Web API sẽ trích xuất giá trị của các thuộc tính Student từ chuỗi truy vấn thay vì thân yêu cầu.
Tương tự như vậy, hãy áp dụng thuộc tính [FromBody] để lấy giá trị của kiểu dữ liệu nguyên thủy từ thân yêu cầu thay vì chuỗi truy vấn, như được hiển thị bên dưới.
Ví dụ: FromBody
public class StudentController : ApiController
{
public Student Post([FromBody]string name)
{
}
}
Sau đây là yêu cầu HTTP POST hợp lệ trong fiddler cho phương thức hành động ở trên.
Hình sau tóm tắt các quy tắc ràng buộc tham số.