2009-05-16 31 views
6

Nếu tôi hiểu chính xác, theo kiểu còn lại, mọi truy vấn (nghĩa là mọi hành động trên mọi tài nguyên không sửa đổi trạng thái của tài nguyên) sẽ được mã hóa trong chuỗi truy vấn, sử dụng phương thức get, không có nội dung nào.Làm cách nào để chuyển các truy vấn phức tạp trong REST?

Tôi có đúng không?

Vâng, tôi có một số ứng dụng giao tiếp với db thông qua một tin nhắn XML được xử lý bởi một thành phần Visual Basic 6.

thông điệp cho một truy vấn là một cái gì đó như thế này

<xml> 
    <service>account</service> 
    <resource>invoice</resource> 
    <action>query</action> 
    <parameters> 
    <page>1</page> 
    <page_len>10</page_len> 
    <order>date</order> 
    <fields>*</fields> 
    <conditions> 
     <date>2009-01-01..2009-01-31</date> 
     <customer_id>24</customer_id> 
    </conditions> 
    </parameters> 
</xml> 

Ngay bây giờ chúng tôi đang trong quá trình thiết kế lại các thông điệp XML của chúng tôi, và chúng tôi muốn làm điều đó trong một cách mà họ có thể dễ dàng ánh xạ tới giao diện RESTful. Trong ví dụ trước, chúng ta cần các thẻ "điều kiện" để ngăn chặn xung đột giữa các tham số và điều kiện (ví dụ, điều gì sẽ xảy ra nếu tôi có một trường có tên là "order", "page" hoặc một cái gì đó tương tự. ..

Chúng tôi mặc dù về việc gửi các thông số với một tiền tố, một cái gì đó giống như

http://account/invoice/?_page=1&_page_len=10&_order=date&_fields=*&date=2009-01-01..2009-01-31&customer_id=24 

và XML sẽ là một cái gì đó giống như

[...] 
    <_order>date</_order> 
    <_fields>*</_fields> 
    <date>2009-01-01..2009-01-31</date> 
    <customer_id>24</customer_id> 
[...] 

Chúng tôi đang cố gắng xác định một số định dạng XML thực sự đơn giản cho các hoạt động crud, và rằng kết quả XML có thể dễ dàng được ánh xạ tới phần còn lại hoặc JSON.

Bạn sẽ ánh xạ loại truy vấn đó trong ứng dụng còn lại như thế nào? Có một số tiêu chuẩn được xác định? hoặc một số trang có các mẫu còn lại/XML/JSON? làm thế nào về trở về lỗi, hoặc bộ dữ liệu lồng nhau?

Cảm ơn rất nhiều.

Trả lời

6

IMHO để làm cho hệ thống của bạn thực sự RESTful, bạn phải suy nghĩ lại tất cả các tin nhắn/truy vấn mà bạn sẽ gửi.

phần này:

<conditions> 
    <date>2009-01-01..2009-01-31</date> 
    <customer_id>24</customer_id> 
</conditions> 

là phần khó khăn. Bạn có những điều kiện nào khác? Có nhiều không? Ví dụ cụ thể này làm cho tôi nghĩ rằng bạn có thể coi hóa đơn là một nguồn cấp dữ liệu phụ của khách hàng. Khi tôi nghỉ ngơi, tôi luôn cố gắng xác định tài nguyên trong đường dẫn và nếu một stil truy vấn cần bất kỳ tham số nào, tôi sẽ chuyển chúng đến chuỗi truy vấn. Vì vậy, tôi sẽ viết một cái gì đó như thế này:

GET /customers/24/invoices?start_date=2009-01-01&end_date=2009-01-31 

Hãy suy nghĩ về mối quan hệ giữa các tài nguyên của bạn. Giả sử chúng ta có kiểu tài nguyên liên quan đến kiểu tài nguyên Foo Bar bởi quan hệ -to-many. Trong trường hợp này, bạn có thể hỏi về mối quan hệ này như sau: GET /foo/123/bar và thêm tham số chuỗi truy vấn để lọc nó. Vấn đề bắt đầu khi bạn muốn lọc nó theo cách liên quan đến các mối quan hệ với các tài nguyên khác. IMHO điều này có nghĩa là thiết kế tài nguyên của bạn không thực sự là RESTful.

0

Bạn cần mã hóa url xml để có thể truyền, nhưng nếu bạn chuyển đổi xml thành json thì bạn có thể truyền chuỗi đó và sau đó là json-> xml hoặc json-> object để xử lý nó. Điều này sẽ cho phép bạn vượt qua các đối tượng phức tạp hơn xung quanh.

Nó không hoàn hảo, nhưng hoạt động. :)

+0

Tôi không tiếp cận cách tiếp cận của bạn, nhưng tôi muốn làm như thế nào nó sẽ được thực hiện theo nguyên tắc còn lại, không chỉ nhồi xml của riêng tôi trong queryString ... – opensas

+0

Nó phụ thuộc vào việc, như đã đề cập, bạn có thể suy nghĩ lại cách bạn nên gửi dữ liệu, nhưng nếu bạn chỉ gửi dữ liệu được đưa vào cơ sở dữ liệu, thì hãy mã hóa dữ liệu để nó có thể được gửi trong một URL có ý nghĩa. Nếu bạn đang sử dụng GET thì bạn sẽ có một cách tiếp cận khác. –

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