2011-10-10 47 views
9

Tôi mới sử dụng các dịch vụ web RESTful và RESTlet. Chúng tôi chỉ có kinh nghiệm xây dựng các ứng dụng web dựa trên servlet (Servlet/JSP trên JBoss/Apache). Bây giờ, chúng tôi đang xây dựng một ứng dụng dựa trên RESTlet nơi API phía máy chủ sẽ được sử dụng bởi hai loại máy khách - web sử dụng trình duyệt và xoay dựa trên máy tính để bàn.Làm cách nào để thực thi 'phiên' trong các dịch vụ web RESTful bằng RESTlet?

Những gì tôi hiểu là theo REST của khái niệm a) máy chủ không thể duy trì các buổi để cải thiện khả năng mở rộng và vài lý do khác b) mỗi yêu cầu từ khách hàng nên được khép kín

Bây giờ, tôi thực sự bối rối làm thế nào để đạt được điều này. Giả sử chúng ta lấy một ứng dụng giỏ mua hàng đơn giản.

Bước 1) Máy khách gửi yêu cầu xác thực, máy chủ xác thực và máy chủ phản hồi OK.

Bước 2) Khách hàng gửi yêu cầu thêm một mục vào giỏ hàng. Máy chủ phản hồi OK.

Bước 3) Khách hàng gửi yêu cầu khác để thêm mục thứ 2 vào thẻ mua sắm. Máy chủ phản hồi OK.

Thông thường, trong một ứng dụng web thông thường, phiên được tạo ở Bước 1 trên máy chủ và từ đó trở đi, tất cả các yêu cầu liên quan đến ứng dụng đó sẽ tự động được liên kết với cùng một phiên và chúng tôi lưu trữ trạng thái phiên trường hợp) trong đối tượng phiên và truy xuất/cập nhật nó với các yêu cầu tiếp theo từ máy khách.

Bây giờ, trong kịch bản trên:

1) làm thế nào để chúng tôi xác thực và ủy quyền cho khách hàng ở bước 2 và 3 nếu không có phiên duy trì trên máy chủ?

2) khách hàng có cần gửi một số thông tin bổ sung cho từng yêu cầu không?

3) Cách chúng tôi truy xuất Giỏ hàng cụ thể của khách hàng trong Bước 3?

4) Khách hàng có cần gửi Giỏ hàng của mình đã được tạo/trả lại bằng máy chủ ở Bước 2 một lần nữa ở Bước 3 không?

Rõ ràng, đây là trường hợp sử dụng đơn giản nhất và vì vậy mọi người phát triển các dịch vụ web RESTful phải thiết kế ứng dụng của họ để xử lý việc này. Cách tốt nhất và phổ biến nhất để xử lý việc quản lý phiên, xác thực, ủy quyền trong các dịch vụ web RESTful bằng RESTLet là gì? Nếu chúng ta phải duy trì bộ nhớ cache ở phía máy chủ với dữ liệu của khách hàng thì điều này khác với máy chủ duy trì các phiên thay mặt chúng ta như thế nào?

Cảm ơn trước, Sâu

Trả lời

15

1) làm thế nào để chúng tôi xác thực và ủy quyền cho khách hàng ở bước 2 và 3 nếu có được không có phiên duy trì trên máy chủ?

2) khách hàng có cần gửi một số thông tin bổ sung với mỗi yêu cầu không?

Có. Bạn phải gửi dữ liệu xác thực/ủy quyền với mọi yêu cầu. Đó là điều sẽ ngăn máy chủ 'nhớ' bạn là ai (tức là, máy chủ không trạng thái, không có phiên nào)

3) Làm cách nào để chúng tôi truy xuất Giỏ hàng cụ thể trong Bước 3?

Hãy đặt câu hỏi khác: Điều gì xảy ra nếu máy chủ khởi động lại? Bạn có muốn tất cả dữ liệu giỏ hàng bị mất không? Chắc là không. Ngụ ý bạn phải lưu trữ nó ở đâu đó mà nó có thể tồn tại khởi động lại. Hiển thị lưu trữ liên tục. Có thể ở trên máy chủ hoặc ứng dụng khách ...

... bây giờ, nếu khách hàng của bạn khởi động lại thì sao? Bạn có thể chọn tạo tài nguyên giỏ hàng 'cho người dùng đó bằng cách sử dụng yêu cầu POST (khi người dùng thêm mục đầu tiên) hoặc tạo nó ngay khi khách hàng đăng nhập (lãng phí). Sau đó, bạn tiếp tục cập nhật các giỏ mua hàng bằng cách sử dụng PUT/DELETE và lấy nó bằng cách sử dụng GET.

Nếu nó nằm trong DB? Có thể, phụ thuộc nếu đó là cách bạn muốn nó được. Nếu nó phải kiên trì, đó là một nơi tốt để giữ nó để nó có thể sống sót khởi động lại.

Vậy làm thế nào để nhận được giỏ hàng cụ thể của khách hàng? Vâng, bạn chỉ cần gửi một yêu cầu GET cho tài nguyên !!! Đó là nó! POST đầu tiên sẽ tạo một tài nguyên tại một URL thích hợp và sau đó bạn có thể sử dụng nó.

Dịch vụ web an toàn cũng có URL an toàn nên đó là phần quan trọng trong thiết kế.

4) Khách hàng có cần gửi Giỏ hàng đó là được tạo/trả lại bằng máy chủ ở Bước 2 một lần nữa trong Bước 3 không?

No. Như đã đề cập ở trên. Nhưng nếu bạn đang sử dụng cookie hoặc LocalStorage hoặc một số thông tin khác ở phía máy khách thì có thể bạn sẽ làm.

Rõ ràng, đây là trường hợp sử dụng đơn giản nhất và do đó mọi người phát triển Dịch vụ web RESTful phải thiết kế ứng dụng của họ để xử lý việc này. Điều gì là cách tốt nhất và phổ biến nhất để xử lý việc quản lý phiên, xác thực, ủy quyền trong các dịch vụ web RESTful bằng RESTLet là gì?

Có. Nó là đơn giản nhưng phải mất một thời gian để suy nghĩ về 'tài nguyên' hơn là 'dịch vụ'. Trong tất cả mọi thứ thiết kế yên tĩnh là (hoặc có thể là) một tài nguyên, bao gồm giao dịch, giỏ hàng, v.v.,

Tuy nhiên, ủy quyền/xác thực là một phần của gói yêu cầu http và được gửi cùng với mọi yêu cầu. Tôi đề nghị bạn đọc những thứ đó.

Nếu chúng ta phải duy trì bộ nhớ cache trên phía máy chủ với dữ liệu của khách hàng thì làm sao này là khác nhau từ máy chủ duy trì phiên thay mặt của chúng tôi?

Sự khác biệt lớn! Bạn đang lưu vào bộ nhớ đệm để thực hiện hoặc duy trì một phiên? Nếu hệ thống khởi động lại hệ thống của bạn sẽ hoạt động liên tục trên một bộ nhớ cache trống không? Nếu có, bạn đang lưu vào bộ nhớ đệm cho hiệu suất khác, bạn đang duy trì trạng thái.

Tôi đề nghị bạn đọc các dịch vụ Web RESTful bởi Richardson & Ruby để chỉnh sửa các khái niệm trên và thu thập thông tin chi tiết hơn về cách thiết kế các dịch vụ an toàn ...

+0

nhưng tại sao nó lại tệ nếu máy chủ nhớ bạn là ai (và chỉ vậy). nếu bạn không tuân thủ REST spec theo cách thủ công, bạn có thể thỏa hiệp và tiết kiệm cho mình khỏi việc gửi xác thực mỗi yêu cầu duy nhất. – amphibient

+0

Thiết kế của bạn có thể tồn tại khi khởi động lại không? Bên cạnh đó luôn luôn có một số kiểm tra để đảm bảo rằng đó là cùng một người và không phải là một phiên bị đánh cắp. – PhD

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