Tại sao một từ vựng cố định nhỏ được xem là một lợi thế cho các dịch vụ RESTful?


13

Vì vậy, một dịch vụ RESTful có một bộ động từ cố định trong từ vựng của nó. Một dịch vụ web RESTful lấy những thứ này từ các phương thức HTTP. Có một số lợi thế được cho là để xác định từ vựng cố định, nhưng tôi không thực sự nắm bắt được vấn đề. Có lẽ ai đó có thể giải thích nó.

Tại sao một từ vựng cố định được REST vạch ra tốt hơn là tự động xác định từ vựng cho từng trạng thái? Ví dụ, lập trình hướng đối tượng là một mô hình phổ biến. RPC được mô tả để xác định các giao diện cố định, nhưng tôi không biết tại sao mọi người cho rằng RPC bị giới hạn bởi các điều khoản này. Chúng tôi có thể tự động chỉ định giao diện giống như một dịch vụ RESTful mô tả động cấu trúc nội dung của nó.

REST được cho là có lợi thế ở chỗ nó có thể phát triển mà không cần mở rộng vốn từ vựng. Các dịch vụ RESTful phát triển linh hoạt bằng cách thêm nhiều tài nguyên hơn. Có gì sai khi mở rộng dịch vụ bằng cách tự động chỉ định từ vựng theo từng đối tượng? Tại sao chúng ta không sử dụng các phương thức được xác định trên các đối tượng của mình làm từ vựng và các dịch vụ của chúng tôi mô tả cho khách hàng những phương thức này là gì và liệu chúng có tác dụng phụ hay không?

Về cơ bản tôi có cảm giác rằng mô tả cấu trúc tài nguyên phía máy chủ tương đương với định nghĩa của từ vựng, nhưng sau đó chúng tôi buộc phải sử dụng từ vựng hạn chế để tương tác với các tài nguyên này.

Liệu một từ vựng cố định có thực sự tách rời mối quan tâm của khách hàng khỏi mối quan tâm của máy chủ không? Tôi chắc chắn phải quan tâm đến một số cấu hình của máy chủ, đây thường là vị trí tài nguyên trong các dịch vụ RESTful. Để phàn nàn về việc sử dụng một từ vựng động có vẻ không công bằng bởi vì chúng ta phải tự động lý do làm thế nào để hiểu cấu hình này theo một cách nào đó. Một dịch vụ RESTful mô tả các chuyển đổi bạn có thể thực hiện bằng cách xác định cấu trúc đối tượng thông qua hypermedia.

Tôi chỉ không hiểu điều gì làm cho một từ vựng cố định tốt hơn bất kỳ từ vựng động tự mô tả nào, có thể dễ dàng hoạt động rất tốt trong một dịch vụ giống như RPC. Đây có phải chỉ là một lý do kém cho từ vựng hạn chế của giao thức HTTP?

Suy tư

Chỉ cần làm rõ suy nghĩ của tôi tốt hơn một chút so với tôi đã làm. Giả sử bạn đang thiết kế bất kỳ API mục đích chung nào, thậm chí có thể không phải đối mặt với web. Bạn có vui không nếu ai đó nói rằng bạn chỉ có thể sử dụng các tên phương thức này trên các đối tượng của mình? REST không bị hạn chế đối với HTTP, nhưng hãy xem xét tình huống mà mọi API bạn viết, web phải đối mặt hoặc đơn giản chỉ bao gồm các đối tượng có chứa các phương thức GET POST PUT và DELETE. Vì vậy, phương thức object.foo mà bạn muốn xác định là không thể. Bạn phải xác định một đối tượng mới gọi là foo và gọi phương thức GET của nó. Đó chính là cách thức hoạt động của REST và nó khiến tôi hơi khó chịu khi nghĩ về nó. Bạn không có bất kỳ hiểu biết chung nào tốt hơn về những gì foo làm, bạn chỉ bị buộc phải tạo một đối tượng mới cho những gì thực chất là một phương thức trên một đối tượng cha. Hơn nữa, API của bạn không kém phần phức tạp, bạn vừa ẩn sự phức tạp của giao diện bằng cách tạo ra nhiều đối tượng hơn. Các dịch vụ web RESTful buộc chúng tôi chấp nhận một giao diện có thể có hoặc không đủ trong bối cảnh API mà chúng tôi đang phơi bày. Có lẽ có một lý do chính đáng để làm điều này với các API phải đối mặt với web, nhưng một lý do chính đáng để không áp dụng các giao diện chuẩn cho mọi đối tượng trong mọi API mục đích chung. Một ví dụ thực tế sẽ được đánh giá cao.


Để giúp người dùng phân tích nhanh câu hỏi và câu trả lời của bạn, bạn có thể xem xét thêm "Cập nhật" dưới dạng câu trả lời riêng biệt (đặc biệt là phần "Cập nhật khác"). Điều này được khuyến khích: blog.stackoverflow.com/2011/07/ Kẻ
Johann

@Johann cảm ơn, các bản cập nhật tiếp theo tồn tại như là câu trả lời được chấp nhận cho câu hỏi này.
Matt Esch

Câu trả lời:


9

Thuật ngữ "động từ" và "danh từ" có phần không may ở đây. Như bạn đã đề cập, bạn có thể dễ dàng tạo đối tượng cho hàm. Tất cả các ngôn ngữ hướng đối tượng ngoại trừ Java đều có sẵn phép chuyển đổi đó và trong Java, cuối cùng bạn sẽ thực hiện nó với rất nhiều đối tượng với một phương thức duy nhất và thường được gọi là "invoke", "exec", "áp dụng" hoặc somesuch (vì vậy, đó là ngôn ngữ lập trình trong đó sự phân biệt "động từ" / "danh từ" thực sự không có ý nghĩa).

Các "động từ" của REST giống như phân loại các phương thức của bạn thành getters, setters (delaries; có thể được coi là loại setters) và loại khác. Và cố gắng làm mọi thứ với getters và setters. Lý giải cho vấn đề này là:

  1. Ngữ nghĩa dễ dàng hơn khi đối mặt với sự thất bại trong giao tiếp, vì cả getters và setters đều là idempotent. Lấy tài nguyên hai lần không có tác dụng bổ sung và cũng không đặt nó thành giá trị mà nó đã có.
  2. Xác định một số ngữ nghĩa có thể được sử dụng bởi proxy có thể lưu bộ đệm mà không hiểu giao diện cụ thể. Getters được lưu trữ và setters được biết là làm mất hiệu lực bộ đệm.

HTTP được thiết kế ngay từ đầu với cả bộ nhớ cache và khả năng chịu lỗi, vì vậy hai điểm này dẫn đến bốn phương thức cơ bản:

  • GETlà một getter. Giả định không sửa đổi trạng thái máy chủ và trả về cùng một giá trị mỗi lần với khả năng chỉ định chính sách hết hạn và xác nhận lại.
  • PUTDELETElà setter và deleter (= setter with nil). Chúng thường không được sử dụng trong ngữ cảnh của web thông thường, nhưng có ý nghĩa đối với REST.
  • POST là một bồn rửa nhà bếp "gọi" chung chung mà bộ nhớ cache không thể giả định được gì.

REST là một mẫu thiết kế mô tả cách sử dụng HTTP thô hoặc các giao thức mạng tương tự để thực hiện giao diện cho phép xử lý dễ dàng các lỗi bằng cách thử lại đơn giản và hoạt động độc đáo với các proxy lưu trữ.

Nó không dễ dàng tương ứng với API lập trình hướng đối tượng thông thường. Tôi nghĩ rằng nó thực sự là một điều tốt. Các thách thức của việc giao tiếp qua mạng vốn không đáng tin cậy và khi các chuyến đi khứ hồi chậm hơn nhiều so với việc chuyển số lượng cuộc gọi dữ liệu vừa phải cho cách tiếp cận thiết kế khác với API trong quá trình, vì vậy khi nó trông khác nhau, mọi người không thử áp dụng Trải nghiệm không hợp lệ từ miền khác rất nhiều (đó là nguyên nhân của SOAP, XML-RPC và như vậy; nó trông giống như các cuộc gọi thủ tục, nhưng không hoạt động như thế và cuối cùng là đau đớn khi làm việc).


2

Ý tưởng thiết yếu là sự phức tạp được thể hiện thông qua biểu diễn tài nguyên, và vì vậy các động từ bổ sung là không cần thiết. Như một số người đã đặt nó - "Trong REST, danh từ là tốt, động từ là xấu."

Nếu bạn nhìn vào bốn động từ REST, chúng có thể được ánh xạ tới các hoạt động CRUD cơ bản, về cơ bản cho phép bạn làm bất cứ điều gì bạn muốn với tài nguyên của mình. Đó là -

POST - Tạo tài nguyên

NHẬN - Đọc tài nguyên

PUT - Cập nhật tài nguyên

XÓA - Xóa tài nguyên

Bạn cần gì nữa?


Tôi có thể tạo điều kiện cho một động từ trong dịch vụ RESTful bằng cách tạo một tài nguyên để thực hiện nó. Như bạn nói, tôi không cần thêm động từ nữa. Tôi chỉ không hiểu tại sao tốt hơn là giả vờ bất kỳ động từ trừu tượng nào là một danh từ khi những gì tôi muốn làm thực sự là một động từ. Có vẻ như các động từ bị hạn chế một cách cưỡng bức mà không có lý do, và tôi đang tránh vấn đề bằng cách tạo ra các danh từ thực hiện các hành động cần thiết khi được truy cập với một nhóm động từ nhỏ. Tại sao nó sẽ tốt hơn để làm điều đó? Cần phải có một tốt lý do cho nó, cái gì tôi có thể định lượng như một ví dụ thực tế.
Matt Esch

4
Lấy danh sách tất cả các tài nguyên, nhận danh sách tất cả các tài nguyên với các ràng buộc nhất định, cập nhật hoặc xóa một loạt các tài nguyên cùng một lúc, tạo hai loại tài nguyên khác nhau cùng một cách nguyên tử (để cả hai sáng tạo đều thất bại hoặc thành công), xóa tất cả tài nguyên bão hòa một điều kiện nhất định ... Danh sách những điều mà người ta có thể muốn làm là khá dài. Người ta có thể điều chỉnh chúng vào API REST, nhưng không phải lúc nào cũng tự nhiên. Nó cũng không giúp GET không cho phép một cơ thể, vì vậy các điều kiện lọc phức tạp trở nên bất thường.
Andrea

Tài nguyên PATCHing cũng khá tuyệt.
Wyatt Barnett

2

Xem xét một ngôn ngữ trong đó tất cả các cấu trúc (như hàm) là các đối tượng. Sau đó, các động từ RESTful chỉ đơn giản là gọi các quy ước và các câu lệnh gán. Đối với JavaScript, bạn có thể xác định cú pháp động từ cố định như INVOKE để gọi hàm, XÓA (giống như xóa trong js) để xóa một đối tượng trên một đối tượng khác, SET để gán giá trị và RETURN để trả về giá trị. Chúng ta có thể sử dụng các động từ HTTP có nghĩa là hàm POST - invoke tương đương, PUT - gán giá trị, GET - trả về một giá trị, - XÓA - xóa một đối tượng. Tôi bị cuốn vào ý tưởng rằng các phương thức HTTP thực sự mô tả các phương thức đối tượng, giao diện đối tượng thực tế, mà tôi không thấy rằng nó thực sự có thể mô tả các khái niệm cấp thấp hơn nhiều, chẳng hạn như các cấu trúc ngôn ngữ cơ bản được cố định rõ ràng và hữu hạn trong tất cả ngôn ngữ lành mạnh.

Và tất nhiên, nó hữu ích cho việc định tuyến / ủy quyền để có một từ vựng cố định để phản ánh.


1
  • Bởi vì một lập trình viên chuyên nghiệp dự đoán hàng trăm, nếu không phải là hàng ngàn tên phương thức khác. Những gì dường như vô nghĩa ở một nhỏ hơn có thể là một vấn đề rất lớn khi ứng dụng trở nên lớn hơn.

  • Bởi vì không cần các tiêu chuẩn về tên phương thức khi chúng đã được xác định.

  • Bởi vì mục đích chính của mã là có thể đọc được mà không cần các bản dịch bổ sung như vậy.

  • Bởi vì nó khuyến khích và hỗ trợ trong việc xác định 'khi nào' một lớp khác nên được chia ra.

  • Khi bạn tiếp quản mã, điều đó hợp lý và thực sự có thể hiểu những gì và làm thế nào để nó nhanh hơn nhiều.

  • Nó cung cấp một từ vựng phổ biến và do đó mức độ trừu tượng để bạn có thể tập trung vào các chi tiết khác và xem các mẫu.

  • Nó làm cho việc tìm lỗi dễ dàng hơn vì mã thông thường và cách tiếp cận dễ dàng được kiểm tra.

  • Khi bạn đang làm việc với nhiều 'lớp', chẳng hạn như một lớp trong phát triển web, việc biết các url phù hợp với tên hành động nào rất thuận tiện để gỡ lỗi.

Nhìn chung, bạn không 'luôn luôn' cần nó, nhưng giống như hầu hết các tiêu chuẩn, sẽ rất có ý nghĩa khi cố gắng sử dụng nó!


Được giải quyết theo thứ tự 1) Vì vậy, một lập trình viên dự đoán hàng trăm nếu không phải là hàng ngàn tài nguyên khác? Chúng tôi đã dự đoán các phương pháp trong các thư viện chúng tôi sử dụng. 2) Vì vậy, chúng ta cần các tiêu chuẩn cho tên phương thức nhưng không phải cho tên tài nguyên? Tôi thất bại trong việc theo logic đó. 3) Không chắc chắn những gì bạn có nghĩa là bản dịch. Nếu bạn nói với tôi một tài nguyên tồn tại tôi phải hiểu nó. Nếu tôi nói với bạn một phương pháp tồn tại, bạn phải hiểu nó. Điều duy nhất tôi thực sự quan tâm là hành động nào của tôi sẽ có tác dụng phụ 4) Bạn có thể mở rộng
Matt Esch

5) một lần nữa bạn có thể mở rộng. Tôi là một lập trình viên. Tôi đã quen làm việc với các cấu trúc đối tượng được xác định rõ. Tại sao chúng ta sẽ không sử dụng cùng một cơ chế này để xác định tất cả các API của mình nếu nó thực sự tốt hơn? 6) Không có mức độ trừu tượng nào đáng để xem xét mà không cần biện minh 7) Một lần nữa bạn có thể mở rộng. Nếu chúng ta hưởng lợi theo cách này chắc chắn chúng ta nên mã hóa tất cả các API như thế này. 8) Tôi mong muốn bất kỳ đối tượng nào tiếp xúc trực tiếp với các phương thức của nó. / object / phương thức không thể nhầm lẫn. Chúng tôi xác định các tiêu chuẩn bằng cách chọn để áp dụng chúng. Tôi đang thiếu động lực vào lúc này.
Matt Esch

Matt bạn có vẻ hơi tranh luận nhưng tôi sẽ nói rằng với 2) Tôi không nói tài nguyên sẽ không cần tiêu chuẩn 3) Bạn sẽ không cần phải hiểu một phương pháp như 'cập nhật' hoặc 'mới' hoặc tạo 'vì bạn biết chính xác những gì làm theo tiêu chuẩn. Tuy nhiên, còn 'MsgToPrimary' thì sao? Tạo một tin nhắn? Cập nhật trạng thái? Gửi email? 7) Có hầu hết các API có thể được hưởng lợi từ điều này và nhiều người đã làm. Tôi sẽ cố gắng tập trung vào các tiêu chuẩn và quy ước về khái niệm là hữu ích và tôi có thể thấy các cập nhật của bạn đang cho thấy điều đó.
Michael Durrant

Tôi chỉ đang cố gắng để hiểu những lợi ích. Các phản biện mạnh mẽ cần được giải quyết để làm rõ vấn đề. Tôi vẫn hiểu rằng một bộ động từ cố định là một loại mô tả ngôn ngữ, nhưng tôi không thực sự đồng ý rằng nó dễ hiểu hơn. Bạn không thể lấy đi một bộ động từ biểu cảm và nói hey, bây giờ chúng ta đã hiểu tất cả các động từ, khi chúng ta không hiểu tất cả các tài nguyên. Tài nguyên đang thay thế động từ. Chúng tôi thay thế foo động từ tùy ý bằng một tài nguyên được gọi là foo. Sự hiểu biết của chúng tôi về foo không rõ ràng hơn so với khi foo là một động từ.
Matt Esch

1

Thay thế là một cái gì đó khủng khiếp: WSDL (còn gọi là Ngôn ngữ định nghĩa dịch vụ web), là một cách (vụng về) để mô tả theo chương trình (phần nào) APIS tùy ý.

REST giới hạn nghiêm ngặt các động từ, đẩy gần như tất cả các biến thể dành riêng cho ứng dụng vào trọng tải của tài liệu. Lợi ích của việc đó là nhiều triển khai của khách hàng có thể giao tiếp với nhiều dịch vụ không đồng nhất. Các máy khách và máy chủ có thể hoàn toàn không biết nhau, một số chưa được viết.

Có một podcast trong đó Stefan Tilkov giải thích REST độc đáo .


1

Có một api còn lại có một bộ động từ cố định, nhưng nó không phải giới hạn ở (hoặc bao gồm GET, POST, PUT, DELETE). Tôi sẽ xem GET, POST, PUT, DELETE như là một triển khai mặc định của REST hoạt động cho 80% tất cả các hệ thống ngoài kia.

Các hệ thống khác đang triển khai nhiều hơn các hoạt động thô sơ có thể (và thực hiện) thực hiện các động từ của riêng chúng cho API REST của chúng. Các động từ như Xuất bản, Tiêu dùng, Xếp hạng, Nhận xét, Tìm kiếm, Duyệt có thể được thêm và thực hiện trong hệ thống REST. Trong khi một số người có thể nói rằng một từ vựng lớn hơn có thể làm cho nó phức tạp hơn, câu trả lời của tôi là nó phụ thuộc. Nếu người dùng mục tiêu của bạn là những người đứng đầu công nghệ hiểu POST là gì thì có, nó có thể phức tạp hơn; tuy nhiên, nếu người dùng mục tiêu API của bạn là người thật (nghĩa là những người không viết mã và không biết POST là gì), thì động từ thực sẽ dễ sử dụng hơn nhiều. Trong thực tế, việc có một bộ động từ thích hợp cho API của bạn sẽ giúp các url ngắn lại (điều này rất quan trọng nếu bạn muốn người dùng nhập chúng vào trình duyệt. Nếu bạn sử dụng từ vựng tùy chỉnh, bạn ' muốn đảm bảo rằng API của bạn và các động từ của nó được ghi lại tốt. Khi sử dụng api REST tùy chỉnh, bạn muốn đảm bảo rằng 'hành động chỉ đọc' của bạn dưới dạng HTTP GET và 'viết hành động' bằng POST.

Mạng xã hội tuổi teen, Piczo.com, (có thể yên nghỉ) đã giới thiệu API REST mở rộng (bao gồm các động từ được đề cập ở trên) được triển khai bằng 7 ngôn ngữ khác nhau!


0

Đơn giản là tốt.

Có những trường hợp khi bạn cần thêm động từ và độ phức tạp, nhưng hầu hết các vấn đề có thể được cắt giảm thành các hành động CRUD đơn giản trên tài nguyên và đó là những gì REST cố gắng phát huy. Khi bạn nghĩ về hầu hết các ứng dụng web, cuối cùng họ đọc và lưu giữ các bản ghi trong kho lưu trữ dữ liệu, sử dụng cùng một hành động rất đơn giản.

object.foo () đều tốt, nhưng nó làm gì? Nó đang trở về cái gì? Là nó sửa đổi trạng thái của đối tượng hoặc bất kỳ phụ thuộc của nó? Bạn có thể gọi nó hai lần và nhận được cùng một kết quả hay nó sẽ cung cấp cho bạn hai giá trị khác nhau? Nếu bạn cũng có object.bar (), chúng có cần được gọi theo thứ tự cụ thể không?

Có rất nhiều kiến ​​thức cần có khi sử dụng API phong phú và họ thường có các quy ước riêng (ví dụ setFoo sẽ biến đổi đối tượng, getBar có thể là idempotent, dispose () hoặc hủy () có nghĩa là không có cuộc gọi nào khác trên cùng một đối tượng sẽ có thể, v.v ...)

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.