Web API : Parameter Binding

Parameter Binding:


Get Action Method with Primitive Parameter:

Xem xét ví dụ về phương thức Get , phương thức này chứa tham số có kiểu dữ liệu nguyên thủy. 
Example: Primitive Parameter Binding

public class StudentController : ApiController
{
    public Student Get(int id) 
    {
              
    }
}


Như bạn thấy phương thức Get chứa tham số id kiểu int. Vì vậy , Web API sẽ thử đính kèm giá trị id của câu truy vấn URL , sau đó chuyển đổi nó thành kiểu int và gán nó vào tham số id của phương thức Get . Ví dụ, nếu một request HTTP là http://localhost/api/student?id=1 thì giá trị của tham số id sẽ là 1.
Sau đây là những request HTTP GET hợp lệ cho phương thức trên
http://localhost/api/student?id=1
http://localhost/api/student?ID=1
Ghi chú:Tên tham số câu truy vấn và têm tham số của phương thức phải giống nhau . Nếu tên không giống nhau thì giá trị của tham số câu truy vấn sẽ không được gán. Thứ tự của tham số có thể khác nhau.

Multiple Primitive Parameters:

Xem xét ví dụ sau về phương thức Get với nhiều tham số có kiểu dữ liệu nguyên thủy.
Example: Multiple Parameters Binding

public class StudentController : ApiController
{
    public Student Get(int id, string name) 
    {

    }
}

Như bạn có thể thấy ở trên , phương thức Get chứa những tham số có kiểu dữ liệu nguyên thủy. Vì vậy, Web API sẽ thử đính kèm những giá trị từ câu truy vấn URL . Ví dụ , nếu một request HTTP là http://localhost/api/student?id=1&name=steve thì giá trị của tham số id sẽ là 1 và name sẽ là "steve".
Sau đây là những reuqest HTTP GET hợp lệ cho phương thức 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
Note:Tên tham số câu truy vấn phải giống với tên của tham số trong phương thức . Tuy nhiên , chúng có thể khác vị trí.

POST Action Method with Primitive Parameter:

HTTP POST request dùng để tạo mới tài nguyên. Nó cũng có thể bao gồm dữ liệu trong body của Request hoặc cũng có thể trong chuỗi truy vấn.
Xem xét phương thức POST sau:
Example: Post Method with Primitive Parameter

public class StudentController : ApiController
{
    public Student Post(id id, string name)
    {
           
    }
}

Như bạn có thể thấy ví dụ trên , phương thức Post() bao gồm những tham số có kiểu dữ liệu nguyên thủy như là id và name. Vì vậy, theo mặc định , Web API sẽ lấy giá trị từ câu truy vấn string. Ví dụ, nếu một request HTTP POST là
https://localhost/api/student?id=1&name=steve thì giá trị của id sẽ là 1 và name sẽ là  "steve" ở phương thức Post() trên.
Bay giờ , hãy xem xét phương thức Post() sau với tham số kiểu phức tạp.
Example: Post Method with Complex Type Parameter

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() ở ví dụ trên chứa tham số kiểu dữ liệu Student . Vì vậy , theo nguyên tắc mặc định , Web API sẽ thử lấy dữ liệu của tham số stud từ body của request HTTP.
Sau đây là request POST HTTP hợp lệ trong fiddler cho phương thức trên
Parameter Binding
Web API trích đối tượng JSON từ body của request trên và chuyển đổi nó thành đối tượng Student một cách tự động bới vì tên của các trường đới tượng JSON khớp với tên của các trưởng trong đối tượng Student.

POST Method with Mixed Parameters:

Phương thức Post có thể chứa những tham số kiểu nguyên thủy và kiểu phức tạp . Xem xép ví dụ sau.
Example: Post Method with Primitive and Complex Type Parameters

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 chứa cả tham số kiểu thức tạp và kiểu nguyên thủy . Vì vậy ,mặc định,Web API sẽ lấy tham số id từ câu truy vấn và tham số student từ body của request.
Following is a valid HTTP POST request in the fiddler for the above action method.
Parameter Binding
Note:Phương thức Post không thể chứa nhiều tham số kiểu phức tạp bởi ví có ít nhất một tham số được cho phép đọc từ body của request.
Ràng buộc tham số cho phương thức Put và Patch sẽ tương tự như phương thức Post trong Web.

[FromUri] and [FromBody]:

You have seen that by default Web API gets the value of a primitive parameter from the query string and complex type parameter from the request body. But, what if we want to change this default behaviour?
Bạn đã thấy rằng mặc định Web API lấy giá trị của tham số nguyên thủy từ câu truy vấn string và kiểu phức tạp từ body của request . Nhưng , nếu chúng ta muốn thay đổi hành vi mặc định này thì sao?

Sử dụng [FromUri] attribute để bắc buộc WebAPI lấy dữ liệu kiểu phức tạp từ câu truy vấn và [FromBody] attribute để lấy dữ liệu nguyên thủy từ body của request , đối ngược với nguyên tắc mặc định.
For example, consider the following Get method.
Example: FormUri

public class StudentController : ApiController
{
    public Student Get([FromUri] Student stud)
    {

    }
}
Trong ví dụ trên , phương thức Get chứa tham số kiểu dữ liệu phức tạp với thuộc tính [FromUri] . Vì vậy , Web API sẽ thử lấy giá trị của tham số kiểu Student từ câu truy vấn. Ví dụ , nếu một HTTP Get http://localhost:xxx/api/student?id=1&name=steve thì WebAPI sẽ tạo ra một đối tượng Student và gán giá trị prop id và name từ giá trị của id và name của câu truy vấn
Note:Name of the complex type properties and query string parameters must match.
The same way, consider the following example of Post method.
Example: FromUri

public class StudentController : ApiController
{
    public Student Post([FromUri]Student stud)
    {

    }
}

As you can see above, we have applied [FromUri] attribute with the Student parameter. Web API by default extracts the value of complex type from request body but here we have applied [FromUri] attribute. So now, Web API will extract the value of Student properties from the query string instead of request body.

The same way, apply [FromBody] attribute to get the value of primitive data type from the request body instead of query string, as shown below.
Example: FromBody

public class StudentController : ApiController
{
    public Student Post([FromBody]string name)
    {

    }
}

Following is a valid HTTP POST request in the fiddler for the above action method.
Parameter Binding
Note:FromBody attribute can be applied on only one primitive parameter of an action method. It cannot be applied on multiple primitive parameters of the same action method.
The following figure summarizes parameter binding rules.
Web API Routing
Web API Parameter Bindings

Nhận xét

Bài đăng phổ biến từ blog này

Web API Routing

Action Method Return Type