Các phiên phía máy chủ có vi phạm REST không?


14

Theo Roy Fielding (một trong những tác giả chính của đặc tả HTTP) trong luận án chuyên đề Phong cách kiến ​​trúc của ông khi thảo luận về REST , ông đề cập:

[E] ach yêu cầu từ máy khách đến máy chủ phải chứa tất cả thông tin cần thiết để hiểu yêu cầu và không thể tận dụng bất kỳ bối cảnh được lưu trữ nào trên máy chủ.

Bằng "bối cảnh được lưu trữ", ông đang đề cập đến trạng thái ứng dụng, ví dụ số trang cho trang tiếp theo là gì so với trạng thái tài nguyên, ví dụ như bất kỳ kho lưu trữ dữ liệu, hình ảnh, v.v. - có thể nói là toàn bộ quan điểm của REST.

Có công bằng không khi nói rằng hầu hết các nỗ lực trong phần còn lại thuần túy (được định nghĩa là một triển khai phù hợp với luận điểm trên) phải thất bại do sự phụ thuộc của chúng vào việc lưu trữ dữ liệu phiên trên máy chủ (liên tục hoặc theo cách khác)?

Khái niệm về một phiên là phổ biến - đặc biệt đối với các nhà phát triển Web - nhưng liệu RESTful có theo định nghĩa trên không?


2
Tôi sẽ nói theo định nghĩa đó thực tế không có gì là yên tĩnh, nhưng định nghĩa đó thậm chí hợp lý như thế nào? Hãy tưởng tượng một tìm kiếm google "yên tĩnh" - nơi bạn phải cung cấp một chỉ mục của internet trong yêu cầu google để nó tìm kiếm cho bạn. Gì? Không, nói rằng bạn không thể có một cửa hàng kiên trì và yên tĩnh sẽ tương đương với việc nói các giao diện yên tĩnh trên thực tế là vô nghĩa. Điều đó không có nghĩa là tất cả chúng ta nên bắt đầu duy trì các phiên trong bộ nhớ và nói rằng nó vẫn là thiết kế nghỉ ngơi tốt ...
Jimmy Hoffa

3
Tôi nghĩ cần lưu ý rằng có sự phân biệt giữa trạng thái ứng dụngtrạng thái tài nguyên (chỉ mục của Google sẽ là trạng thái tài nguyên và hoàn toàn hợp pháp). Tôi nên làm rõ hơn trong câu hỏi.
Matt

Có sự phân biệt như vậy? Xin vui lòng, xác định nó. :) Tôi đã thấy mọi người cố gắng xác định những điều này trước đây, nhưng nó thực sự mờ vì chúng thực sự không khác nhau. Cả hai đều là dữ liệu có thể thay đổi, sự khác biệt duy nhất có liên quan giữa một dạng trạng thái này và một dạng khác là liệu nó có tồn tại hay không, trong đó dạng không có nghĩa là nó thường có thể tái tạo được, điều này làm cho nó khác biệt.
Jimmy Hoffa

1
Tôi đã tự hỏi điều này bản thân mình. Vì không ai từng giải thích lý do tại sao ứng dụng của tôi muốn có một ngôi sao "yên tĩnh" bằng vàng hoặc tôi không thực sự lo lắng về điều đó.
psr

Câu trả lời:


10

Tôi sẽ nói có, trạng thái phiên làm cho ứng dụng RESTful không RESTful. Ví dụ tầm thường, chị tôi đăng ký vào Tạp chí Phố Wall. Một cách thường xuyên, cô ấy sẽ đọc một cái gì đó đằng sau paywall và quyết định gửi một liên kết (thông qua ứng dụng email của chính cô ấy, không phải qua WSJ) cho một người bạn không có tài khoản WSJ. Nhấp, gửi, thất bại. Rõ ràng trải nghiệm của chị tôi tại URL đó khác với bạn của cô ấy.

Liên quan, nhưng không nghiêm túc về chủ đề: Tôi đang trong giai đoạn thiết kế ban đầu của một ứng dụng được thiết kế để hỗ trợ các nỗ lực nghiên cứu quan trọng trên mạng (được gọi là nhiệm vụ (nghĩ: đánh dấu trên steroid và LSD)). Chủ sở hữu của nhiệm vụ muốn chia sẻ một chế độ xem cụ thể về dữ liệu của mình với người khác, nhưng chế độ xem này yêu cầu kết hợp trạng thái UI (ví dụ: trực quan hóa dữ liệu nào đang hiển thị trong bảng nào) cùng với quyền thích hợp để truy cập UI và dữ liệu được hiển thị. Có rất nhiều trạng thái được lưu trữ cần thiết cho người nhận để có được chế độ xem dự định.

Giải pháp hiện tại của tôi là lưu trữ tất cả UI / ACL / bất kỳ thông tin nào cần thiết cho chế độ xem trong một đối tượng riêng biệt và trả lại URL (có thể là UUID) cho đối tượng đó . Tôi tin rằng việc truy cập đối tượng xem có thể được coi là RESTful theo nghĩa là mọi người sở hữu nó đều có cùng thông tin / kinh nghiệm.


1
Bạn đang xem ví dụ đối tượng là một góc khác về điều này. Khéo léo.
Matt

Chấp nhận đây là câu trả lời, mặc dù có những câu trả lời tuyệt vời khác, chủ yếu là vì nó trả lời trực tiếp câu hỏi và đưa ra một ví dụ rất rõ ràng. Ngoài ra, phần thứ hai trên các đối tượng xem nghiêng quy mô.
Matt

1
Nếu bạn nói rằng trang wsj là một ví dụ về một ứng dụng không nghỉ ngơi, tôi sẽ không đồng ý rằng ví dụ của bạn cho thấy điều đó. Nếu trang web WSJ chẳng hạn dựa vào dữ liệu được cung cấp hoàn toàn bởi khách hàng của chị bạn để trình bày dữ liệu của cô ấy, thì đó là theo định nghĩa @Matt đưa ra, RESTful. Tuy nhiên, nếu nó dựa vào trạng thái phiên trong bộ nhớ tạm thời thì đó là định nghĩa mà Matt đưa ra không phải là RESTful. Tôi chỉ chỉ ra điều này bởi vì định nghĩa mà Matt đưa ra dựa trên các chi tiết cụ thể trong khi REST được xác định tốt hơn bằng kỹ thuật tiêu thụ.
Jimmy Hoffa

@JimmyHoffa - Sự hiểu biết của tôi về các ràng buộc của REST là nó không trạng thái . Điều đó có vẻ khá mơ hồ với tôi.
Peter Rowell

Nếu ứng dụng WSJ không có trạng thái, bài viết có thể xem được sẽ phải được gửi bởi khách hàng. Bài viết đó có thể được chỉnh sửa bất cứ lúc nào bởi các quản trị viên trang web, đừng nhầm đó là một phần trạng thái của ứng dụng WSJ. Tôi nghĩ rằng sự khác biệt đang được cố gắng là nó là trạng thái bền bỉ , do đó nó sẽ có nhiều đảm bảo hơn và ít chi phí quản lý hơn trạng thái không nhất quán như các phiên, cùng với việc kiểm soát nguyên tử đơn giản hơn trong các giao dịch trên đó. Điều này cùng với mô hình tiêu thụ đơn giản là những gì mọi người muốn nghỉ ngơi. (Tôi nghĩ)
Jimmy Hoffa

2

Các phiên phía máy chủ có vi phạm REST không?

Họ chắc chắn làm! Khi bạn triển khai REST, không được có phiên phía máy chủ, nếu không bạn có giải pháp RPC / REST lai.

Máy khách phải gửi đến dịch vụ RESTful tất cả bối cảnh cần thiết để phục vụ yêu cầu, bao gồm thông tin cần thiết để xác thực ứng dụng khách, mỗi khi yêu cầu mới được thực hiện. Máy chủ có thể tự do lưu trữ thông tin để giúp phục vụ các yêu cầu tiếp theo nhanh hơn, nhưng thông tin được lưu trong bộ nhớ cache không được tính vào phiên phía máy chủ. Nói cách khác, bản thân yêu cầu phải chứa đủ thông tin cần xử lý ngay cả khi không có trạng thái lưu trữ.


1

Có lẽ phụ thuộc vào ý của bạn là "dữ liệu phiên". Đó có phải là một thuật ngữ chính xác?

Giao tiếp an toàn giữa hai bên thường liên quan đến máy chủ để tạo (và lưu trữ) "mã thông báo truy cập" giới hạn thời gian mà khách hàng phải cung cấp cho mỗi yêu cầu như một cách ủy quyền. Mã thông báo truy cập này đã là cái mà tôi gọi là "dữ liệu phiên" - nó được lưu trữ ở phía máy chủ, giới hạn thời gian và liên quan đến một khách hàng (thường là quyền của anh ta).

Tôi sẽ rất ngạc nhiên nếu loại hoạt động này được dán nhãn là không RESTful. OAuth là một ví dụ.

Tôi không phải là chuyên gia và tôi không tự tin lắm ở đây; Tôi chỉ chia sẻ những hiểu biết của mình với hy vọng chúng hữu ích.


1

Điểm quan trọng nhất của REST là một URI tới một ressource luôn trỏ đến cùng một ressource. Vì vậy, người dùng có thể chuyển qua một tham chiếu đến nguồn tài nguyên này và mọi người đều thấy như vậy. Điều này được gọi là Chuyển giao trạng thái đại diện (REST). Nếu máy chủ giữ trạng thái và cung cấp một nguồn tài nguyên khác cho cùng một URI, tôi sẽ nói đây không phải là REST thuần túy nữa.


điều đó không nhất thiết đúng là người dùng sẽ thấy điều tương tự .. Access có thể ra lệnh cho bất kỳ người dùng nào được nhìn thấy.
Erik

@Erik Nhưng người dùng sẽ cho biết họ muốn xem bao nhiêu trong yêu cầu (Bao gồm cả việc sử dụng Tiêu đề chấp nhận), vì vậy câu trả lời của Puckl là đúng.
Johan

1
@Johan Tôi sẽ trả lại dữ liệu khác nhau cho những người dùng khác nhau, từ cùng một điểm cuối. Nếu không thì điểm xác thực người dùng là gì.
Erik

@Erik Tôi cũng sẽ làm điều đó. Dù sao đi nữa, tôi tin rằng xác thực nằm ngoài trạng thái của tài nguyên, vì vậy, nói đúng ra nếu chế độ xem bị ảnh hưởng bởi người dùng được xác thực thì nó không còn RESTful nữa. Có thể nếu bạn muốn huy hiệu RESTful của mình, bạn nên tạo nhiều "lượt xem" tài nguyên, tùy thuộc vào người đang yêu cầu quyền truy cập, nó cho phép truy cập chỉ một số lượt xem. Vì vậy, công chúng có thể có quyền truy cập vào / userprofiles / {userID} / publicview và người dùng có quyền truy cập vào / userprofiles / {userID} / fullprofile và bạn bè được ủy quyền có quyền truy cập vào / userprofiles / {userID} / friendsview
Johan

0

Các phiên về cơ bản được sử dụng để thêm trạng thái vào các ứng dụng RESTful, không trạng thái. Vì vậy, chính thức, điều này làm cho ứng dụng RESTful của bạn trở nên trạng thái, tuy nhiên việc máy chủ giữ trạng thái giúp cuộc sống của bạn dễ dàng hơn một chút, vì bạn không phải chuyển tất cả dữ liệu qua lại trên mỗi yêu cầu / phản hồi.

Các phiên, và nói chung là cho phép bạn tránh điều này và điều này có một số lợi ích tích cực trong hiệu suất (ít truyền dữ liệu) và bảo mật (ít dữ liệu có sẵn để giả mạo).

Vì vậy, trong khi nó chính thức vi phạm một phần định nghĩa của REST, thật hữu ích khi thấy các ứng dụng RESTful không sử dụng trạng thái qua các phiên.


Tôi không đồng ý. Bạn có một trang web mua sắm cho phép bạn lọc theo nhãn hiệu, màu sắc và kích thước. Các trang web Web 1.0 truyền thống sẽ xử lý việc này với một số hộp kiểm, phiên phía máy chủ và POST. Nếu tôi muốn chia sẻ liên kết đến example.org/shumps, mọi người sẽ không thấy rằng tôi đã chọn Trung bình, Đen và Rễ. (Điều này cũng gây ra thông báo "bạn đang rePOSTing dữ liệu" xấu xí khi bạn nhấp lại.) Nhưng nếu tôi chia sẻ liên kết đến (ví dụ) example.org/shirts/medium-black-roots, mọi người đều có cùng một đại diện. Tất cả thông tin trạng thái cần thiết đều có trong URL (hoặc phần thân POST nếu cần, nhưng bạn không thể chia sẻ thông tin đó).
Jesse Hội nguyên

... RESTful có thể không phù hợp với mọi thứ. Là tài nguyên ứng dụng giả định của bạn được định hướng (một trang web mua sắm chắc chắn là!)? Có lẽ nó có thể không phù hợp với một RIA, với rất nhiều trạng thái, không định hướng tài nguyên. Tôi không thể nghĩ ra bất kỳ ví dụ tốt để thành thật.
Jesse Hội nguyên

0

Fielding có nghĩa là gì bởi tuyên bố đó là máy chủ ứng dụng lưu trữ API REST không liên kết trạng thái môi trường xung quanh với một yêu cầu theo một số loại cơ chế đằng sau hậu trường. Hãy xem xét sự khác biệt giữa một máy chủ ứng dụngmáy chủ cơ sở dữ liệu . Ràng buộc REST là máy chủ ứng dụng nên không trạng thái . Tuy nhiên, máy chủ ứng dụng có thể ủy quyền các yêu cầu cho trạng thái tài nguyên cho máy chủ cơ sở dữ liệu dựa trên thông tin là một phần của yêu cầu, chẳng hạn như kết hợp người dùng / mật khẩu trong tiêu đề Ủy quyền hoặc chính Uri. Xét cho cùng, REST dựa trên mô hình máy khách / máy chủ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.