2013-02-28 19 views
6

Làm thế nào để thiết kế địa chỉ REST cho thu thập tài nguyên, bộ lọc tài nguyên theo thuộc tính không bằng một giá trị đã cho?Url REST để thu thập tài nguyên, bộ lọc tài nguyên theo thuộc tính không bằng một giá trị đã cho

Ví dụ, để có được những học sinh lớp 8, chúng tôi sử dụng

GET /students?grade=8 

Làm thế nào để làm như vậy, nếu chúng ta cần phải nhận được các sinh viên không ở lớp 8? Và làm thế nào để thiết kế cho ít hơn (<), lớn hơn (>) vv?

+0

kiểm tra nếu liên kết này là hữu ích http://stackoverflow.com/questions/4614255/rest-url-design-for-greater-than-less-than-operations – rvini

+0

Tuy nhiên, nó nói thêm về pagination –

Trả lời

3

Một tùy chọn sẽ là thêm tham số truy vấn bổ sung như gradeOperator, trong đó bạn có thể chuyển toán tử được sử dụng khi so sánh giá trị với thông số grade. Ví dụ:

GET /students?grade=8&gradeOperator=!%3D 

!%3D là hình thức URL-encoded của !=, vì vậy REST API của bạn sẽ de-mã hóa các nhà điều hành và giải thích điều này như grade != 8.

Một cách tiếp cận khác là chuyển giá trị và toán tử trong phần thân yêu cầu HTTP. Một cái gì đó như thế này có khả năng sẽ làm việc (với cơ thể được cung cấp trong JSON là một ví dụ):

GET /students 
Content-Type: application/json 

{ "grade": {"value": 8, "operator": "!=" } } 

Đó có thể thoải mái vì bạn sẽ không phải lặp lại từ 'lớp' trong gradeOperator, các nhà điều hành chỉ đơn giản là lồng nhau bên trong một đối tượng JSON làm giá trị của grade.

Trong cả hai giải pháp, bạn có khả năng có thể xác định bất kỳ số lượng các nhà khai thác, bao gồm <, >, >=, <= vv Chỉ cần chắc chắn để khử trùng đúng cách bất kỳ nhà khai thác đầu vào API của bạn nhận được, đặc biệt nếu sử dụng trong một truy vấn DB, để tránh những thứ như SQL injection tấn công.

7

Điều tôi đang nghĩ đến là thực hiện bao gồm toán tử như một phần của đối số, được phân cách bằng giá trị. Tôi cũng sẽ xác định các toán tử không mang tính biểu tượng để tránh sự cần thiết phải mã hóa URL hoặc nhầm lẫn với dấu bằng sau tên tham số. Ví dụ của bạn, đây sẽ là một cái gì đó như thế này dành cho sinh viên không học lớp 8:

GET /students?grade=neq|8 

Học sinh từ lớp> 8 sẽ là:

GET /students?grade=gt|8 

Học sinh giữa lớp 8 và 10 (bao gồm):

GET /students?grade=gte|8,lte|10 

Cách tiếp cận này có thể được mở rộng đến các trường có thể lọc khác mà không cần phải thêm tham số bổ sung để sửa đổi cách mỗi trường được lọc.

Các vấn đề liên quan