Dịch vụ web kiểu Netflix hoặc Twitter nên sử dụng REST hoặc SOAP? [đóng cửa]


145

Tôi đã triển khai hai dịch vụ REST: Twitter và Netflix. Cả hai lần, tôi đấu tranh để tìm ra cách sử dụng và logic liên quan đến quyết định đưa ra các dịch vụ này dưới dạng REST thay vì SOAP. Tôi hy vọng ai đó có thể gợi ý cho tôi về những gì tôi đang thiếu và giải thích tại sao REST được sử dụng làm triển khai dịch vụ cho các dịch vụ như vậy.

  1. Việc triển khai dịch vụ REST mất nhiều thời gian hơn so với triển khai dịch vụ SOAP. Các công cụ tồn tại cho tất cả các ngôn ngữ / khung / nền tảng hiện đại để đọc trong WSDL và các lớp và máy khách proxy đầu ra. Việc triển khai dịch vụ REST được thực hiện bằng tay và - có được điều này - bằng cách đọc tài liệu. Hơn nữa, trong khi thực hiện hai dịch vụ này, bạn phải đưa ra "dự đoán" về những gì sẽ quay trở lại qua đường ống vì không có lược đồ hoặc tài liệu tham khảo thực sự.

  2. Tại sao lại viết một dịch vụ REST trả về XML? Sự khác biệt duy nhất là với REST bạn không biết các loại mà mỗi phần tử / thuộc tính đại diện - bạn tự mình thực hiện nó và hy vọng rằng một ngày nào đó một chuỗi không xuất hiện trong một lĩnh vực mà bạn nghĩ luôn luôn là một int. SOAP xác định cấu trúc dữ liệu bằng WSDL, vì vậy đây là một công cụ không có trí tuệ.

  3. Tôi đã nghe thấy khiếu nại rằng với SOAP, bạn có "chi phí chung" của Phong bì SOAP. Trong thời đại ngày nay, chúng ta có thực sự cần phải lo lắng về một số byte không?

  4. Tôi đã nghe lập luận rằng với REST, bạn có thể chỉ cần đưa URL vào trình duyệt và xem dữ liệu. Chắc chắn, nếu dịch vụ REST của bạn đang sử dụng đơn giản hoặc không có xác thực. Ví dụ, dịch vụ Netflix sử dụng OAuth yêu cầu bạn ký tên và mã hóa mọi thứ trước khi bạn có thể gửi yêu cầu của mình.

  5. Tại sao chúng ta cần một URL "có thể đọc được" cho mỗi tài nguyên? Nếu chúng tôi đang sử dụng một công cụ để triển khai dịch vụ, chúng tôi có thực sự quan tâm đến URL thực tế không?


5
Bạn nên lưu ý rằng REST chưa được "phát minh", nó tồn tại từ đầu HTTP.
Dirk Vollmar

5
Một cuộc trò chuyện giữa bạn và Roy Fielding sẽ khá thú vị. :)
Gert Grenander

1
Một vài điều để bắt đầu chúng tôi. Đầu tiên, ghét là một từ mạnh mẽ. Thứ hai, ngành công nghiệp của chúng tôi chứa đầy hơn một cách để làm việc. Vì vậy, tôi sẽ không đi vào tranh luận triết học cho sự tồn tại của REST. Là một nhà phát triển giỏi , bạn nên sẵn sàng sử dụng công nghệ nào để giải quyết vấn đề tốt nhất. Đối với một số dịch vụ web, đó có thể là REST. Tôi đã viết nhiều hơn, nhưng điều này đã bị đóng cửa;)
Jason McCreary

1
@Joe: Điểm lấy. Nhưng một phần của sự trớ trêu của REST là nó không phải là một công nghệ "mới", nó chỉ là một từ thông dụng mới cho những thứ hoạt động từ đầu những năm 90. Và @ jsm11482: đó chính xác là lý do tại sao câu hỏi này được đóng lại là "chủ quan và tranh luận" - bởi vì nó thu hút các đối số!
Daniel Pryden

2
Câu trả lời của tôi cho câu hỏi này là ở đây bit.ly/cAdYAr
Darrel Miller

Câu trả lời:


193

Một con chim hoàng yến trong một mỏ than.

Tôi đã chờ đợi một câu hỏi như thế này gần một năm nay. Không thể tránh khỏi ngày này sẽ đến và tôi chắc chắn chúng ta sẽ thấy nhiều câu hỏi như thế này trong những tháng tới.

Các dấu hiệu cảnh báo

Bạn hoàn toàn chính xác, sẽ mất nhiều thời gian hơn để xây dựng các máy khách RESTful so với các máy khách SOAP. Các bộ công cụ SOAP lấy đi rất nhiều mã soạn sẵn và làm cho các đối tượng proxy máy khách có sẵn mà hầu như không cần nỗ lực. Với một công cụ như Visual Studio và URL máy chủ, tôi có thể truy cập các đối tượng từ xa có độ phức tạp tùy ý, cục bộ trong vòng năm phút.

Các dịch vụ trả lại ứng dụng / xml và application / json rất khó chịu đối với các nhà phát triển ứng dụng khách. Chúng ta phải làm gì với đống dữ liệu đó?

May mắn thay, rất nhiều trang web cung cấp dịch vụ REST cũng cung cấp một loạt các thư viện máy khách để chúng tôi có thể sử dụng các thư viện đó để có quyền truy cập vào một loạt các đối tượng được gõ mạnh. Có vẻ như ngu ngốc. Nếu họ đã sử dụng SOAP, chúng ta có thể tự mã hóa các lớp proxy đó.

SOAP trên cao, ha. Đó là độ trễ giết chết. Nếu mọi người thực sự lo lắng về số lượng byte dư thừa đi qua dây thì có lẽ HTTP không phải là lựa chọn đúng đắn. Bạn đã thấy có bao nhiêu byte được sử dụng bởi tiêu đề tác nhân người dùng?

Vâng, bạn đã bao giờ thử sử dụng trình duyệt web làm công cụ gỡ lỗi cho bất kỳ thứ gì khác ngoài HTML và javascript. Tin tôi đi Bạn chỉ có thể sử dụng hai trong số các động từ, bộ nhớ đệm liên tục bị cản trở, việc xử lý lỗi nuốt quá nhiều thông tin, nó liên tục tìm kiếm một favicon.ico chết tiệt. Cứ bắn tôi đi.

URL có thể đọc được. Chỉ có danh từ, không có động từ. Vâng, điều đó thật dễ dàng miễn là chúng ta chỉ thực hiện các thao tác CRUD và chúng ta chỉ cần truy cập vào một hệ thống phân cấp các đối tượng theo một cách. Thật không may, hầu hết các ứng dụng cần nhiều chức năng hơn một chút.

Thảm họa sắp xảy ra

Có một số lượng lớn các nhà phát triển hiện đang phát triển các ứng dụng tích hợp với các dịch vụ REST đang trong quá trình đưa ra cùng một kết luận mà bạn có. Họ được hứa hẹn sự đơn giản, linh hoạt, khả năng mở rộng, khả năng tiến hóa và chén thánh của việc tái sử dụng serendipitous. Các đặc điểm của web, làm thế nào mọi thứ có thể đi sai.

Tuy nhiên, họ đang thấy rằng phiên bản cũng là một vấn đề, nhưng trình biên dịch không giúp phát hiện vấn đề. Mã khách hàng viết tay là một nỗi đau để duy trì khi cấu trúc dữ liệu phát triển và URL được cấu trúc lại. Thiết kế API xung quanh chỉ danh từ và bốn động từ có thể thực sự khó khăn, đặc biệt là với những người quá khích Url RESTful cho bạn biết khi nào bạn có thể và không thể sử dụng chuỗi truy vấn.

Các nhà phát triển sẽ bắt đầu hỏi tại sao chúng ta lãng phí nỗ lực của mình để hỗ trợ cả định dạng Json và định dạng Xml, tại sao không tập trung nỗ lực vào một và làm tốt?

Làm thế nào mà mọi thứ đi quá sai

Tôi sẽ nói cho bạn biết những gì đã sai. Chúng tôi là nhà phát triển để cho các bộ phận tiếp thị tận dụng điểm yếu chính của chúng tôi. Cuộc tìm kiếm vĩnh cửu của chúng tôi về viên đạn bạc đã khiến chúng tôi mù quáng về thực tế của REST thực sự là gì. Trên bề mặt REST có vẻ rất dễ dàng và đơn giản. Đặt tên cho tài nguyên của bạn bằng Url và sử dụng GET, PUT, POST và DELETE. Chết tiệt, các nhà phát triển của chúng tôi đã biết cách làm điều đó, chúng tôi đã làm việc với các cơ sở dữ liệu trong nhiều năm có các bảng và cột và các câu lệnh SQL có CHỌN, CHERTN, CẬP NHẬT và XÓA. Nó nên là một miếng bánh.

Có những phần khác của REST mà một số người thảo luận, chẳng hạn như tự mô tả và ràng buộc hypermedia, nhưng những ràng buộc này không đơn giản như nhận dạng tài nguyên và giao diện thống nhất. Dường như để thêm sự phức tạp trong đó mục tiêu mong muốn là sự đơn giản.

Phiên bản REST xuống nước này đã được xác nhận trong văn hóa nhà phát triển theo nhiều cách. Các khung máy chủ được tạo ra khuyến khích Nhận dạng tài nguyên và giao diện thống nhất, nhưng không làm gì để hỗ trợ các ràng buộc khác. Các thuật ngữ bắt đầu nổi xung quanh việc phân biệt các cách tiếp cận, (HI-REST vs LO-REST, Corporate REST vs Học thuật REST, REST vs RESTful).

Một số người hét lên rằng nếu bạn không áp dụng tất cả các ràng buộc thì đó không phải là REST. Bạn sẽ không nhận được lợi ích. Không có một nửa REST. Nhưng những tiếng nói đó đã được dán nhãn là những người nhiệt thành tôn giáo, những người buồn bã rằng thuật ngữ quý giá của họ đã bị đánh cắp khỏi sự tối nghĩa và trở thành chủ đạo. Những người ghen tị cố gắng làm cho REST nghe có vẻ khó khăn hơn nó.

REST, thuật ngữ, chắc chắn đã trở thành chủ đạo. Hầu như mọi thuộc tính web chính có API đều hỗ trợ "REST". Twitter và Netflix là hai cái có cấu hình rất cao. Điều đáng sợ là tôi chỉ có thể nghĩ về một API công khai tự mô tả và có một số ít thực sự thực hiện ràng buộc hypermedia. Chắc chắn một số trang web như StackOverflow và Gowalla hỗ trợ các liên kết trong phản hồi của họ, nhưng có những lỗ hổng lớn trong liên kết của họ. API StackOverflow không có trang gốc. Hãy tưởng tượng trang web sẽ thành công như thế nào nếu không có trang chủ cho trang web!

Bạn đã bị lừa tôi sợ

Nếu bạn đã đi xa đến mức này, câu trả lời ngắn gọn cho câu hỏi của bạn là các API đó (Netflix và Twitter) không tuân thủ tất cả các ràng buộc và do đó bạn sẽ không nhận được lợi ích mà REST apis phải mang lại.

Các máy khách REST mất nhiều thời gian để xây dựng hơn các máy khách SOAP nhưng chúng không bị ràng buộc với một dịch vụ cụ thể, do đó bạn có thể sử dụng lại chúng trên các dịch vụ. Lấy ví dụ cổ điển về trình duyệt web. Trình duyệt web có thể truy cập bao nhiêu dịch vụ? Còn về Trình đọc thức ăn thì sao? Bây giờ có bao nhiêu dịch vụ khác nhau mà khách hàng Twitter trung bình có thể truy cập? Vâng, chỉ một.

Các máy khách REST không được xây dựng để giao tiếp với một dịch vụ duy nhất, chúng được cho là được xây dựng để xử lý các loại phương tiện cụ thể có thể được phục vụ bởi bất kỳ dịch vụ nào. Câu hỏi rõ ràng là, làm thế nào bạn có thể xây dựng ứng dụng khách REST cho một dịch vụ cung cấp ứng dụng / json hoặc ứng dụng / xml. Vâng, bạn không thể. Đó là bởi vì các định dạng đó hoàn toàn vô dụng đối với máy khách REST. Bạn tự nói với chính mình,

bạn phải đưa ra "dự đoán" về những gì sẽ quay trở lại trên đường ống vì không có lược đồ hoặc tài liệu tham khảo thực sự

Bạn hoàn toàn chính xác cho các dịch vụ như Twitter. Tuy nhiên, ràng buộc tự mô tả trong REST nói rằng tiêu đề loại nội dung HTTP sẽ mô tả chính xác nội dung đang được truyền qua dây. Cung cấp ứng dụng / json và application / xml không cho bạn biết gì về nội dung.

Khi xem xét hiệu suất của các hệ thống dựa trên REST, cần nhìn vào bức tranh lớn hơn. Nói về byte phong bì cũng giống như nói về việc giải nén vòng lặp khi so sánh sắp xếp nhanh với sắp xếp theo vỏ. Có những kịch bản mà SOAP có thể hoạt động tốt hơn và có những kịch bản mà REST có thể hoạt động tốt hơn. Bối cảnh là tất cả.

REST đạt được nhiều lợi thế về hiệu suất của nó bằng cách rất linh hoạt về loại phương tiện nào nó hỗ trợ và bằng cách hỗ trợ tinh vi cho bộ nhớ đệm. Để bộ nhớ đệm hoạt động tốt mặc dù gần như tất cả các ràng buộc phải được tuân thủ.

Điểm cuối cùng của bạn về các url có thể đọc được cho đến nay là mỉa mai nhất. Nếu bạn thực sự cam kết với ràng buộc hypermedia, thì mỗi URL có thể là GUID và nhà phát triển ứng dụng khách sẽ không mất gì về khả năng đọc.

Việc các URI phải mờ đục đối với máy khách là một trong những điều quan trọng nhất khi phát triển các hệ thống REST. Các URL có thể đọc được thuận tiện cho nhà phát triển máy chủ và các URL có cấu trúc tốt giúp khung máy chủ gửi các yêu cầu dễ dàng hơn, nhưng đó là các chi tiết triển khai không có tác động đến các nhà phát triển sử dụng API.

API Twitter thậm chí không gần với RESTful và đó là lý do tại sao bạn không thể thấy bất kỳ lợi ích nào khi sử dụng nó qua SOAP. API Netflix gần hơn nhiều nhưng việc sử dụng các loại phương tiện chung cho thấy rằng việc không tuân thủ ngay cả một ràng buộc duy nhất có thể có tác động sâu sắc đến lợi ích thu được từ dịch vụ.

Nó có thể không phải là tất cả lỗi của họ

Tôi đã thực hiện rất nhiều việc bán phá giá đối với các nhà cung cấp dịch vụ, nhưng phải mất hai lần để nhảy RESTly. Một dịch vụ có thể tuân theo tất cả các ràng buộc về mặt tôn giáo và khách hàng vẫn có thể dễ dàng hoàn tác tất cả các lợi ích.

Nếu một máy khách mã cứng các url để truy cập vào một số loại tài nguyên nhất định thì điều đó ngăn máy chủ thay đổi các url đó. Bất kỳ loại xây dựng URL nào dựa trên kiến ​​thức ngầm về cách dịch vụ cấu trúc các url của nó là vi phạm.

Việc đưa ra các giả định về loại hình đại diện nào sẽ được trả về từ một liên kết có thể dẫn đến các vấn đề. Giả định về nội dung của đại diện dựa trên kiến ​​thức không được nêu rõ ràng trong các tiêu đề HTTP chắc chắn sẽ tạo ra khớp nối sẽ gây đau đớn trong tương lai.

Họ có nên sử dụng SOAP?

Cá nhân, tôi không nghĩ vậy. REST thực hiện đúng cho phép một hệ thống phân tán phát triển trong thời gian dài. Nếu bạn đang xây dựng các hệ thống phân tán có các thành phần được phát triển bởi những người khác nhau và cần tồn tại trong nhiều năm, thì REST là một lựa chọn khá tốt.


4
Điều này có thể không hoàn toàn đúng. Amazon có cả giao diện SOAP và REST cho các dịch vụ web của họ và 85% sử dụng của họ là giao diện REST. Bất chấp tất cả sự cường điệu của công ty đối với ngăn xếp SOAP, đây là bằng chứng khá thuyết phục cho thấy các nhà phát triển thích cách tiếp cận REST đơn giản hơn. NGUỒN: oreillynet.com/pub/wlg/3005
Suraj Chandran

3
Không, đó chỉ là bằng chứng thuyết phục cho thấy các nhà phát triển web thích những gì họ cho là đơn giản hơn, không phải là nó thực sự vượt trội trong bất kỳ cách thức dài hạn nào, hay theo cách định hướng hiệu suất. Thực tế là, công cụ chính xác cho công việc cụ thể là những gì được yêu cầu, chứ không phải "Tôi biết công cụ này, vì vậy tất cả các công việc phải phù hợp với nó."
Kevin Williams

61

SOAP là một hướng đối tượng , Remote Procedure Call công nghệ ngăn xếp. Nó hoạt động bằng cách xây dựng một sự trừu tượng mới trên giao thức hiện có (HTTP).

REST là một cách tiếp cận theo định hướng tài liệu , chỉ đơn giản là sử dụng các tính năng của giao thức hiện có (HTTP). "REST" chỉ là một từ thông dụng - khái niệm này là: Chỉ cần sử dụng web theo cách nó được thiết kế để hoạt động!

Đáp lại các chỉnh sửa cho câu hỏi:

  1. "Việc triển khai dịch vụ REST mất nhiều thời gian hơn so với triển khai dịch vụ SOAP."

    Um, không, nó có thể không phải là vô hạn dài hơn. Và trong trường hợp những gì bạn đang cố gắng truy xuất đã là một tài liệu hoặc tệp , nó thực sự nhanh hơn nhiều . Ví dụ: thông số OGC cho WMS (Dịch vụ lập bản đồ web) xác định cả phiên bản SOAP và REST của giao thức, và có một lý do tại sao hầu như không ai thực hiện phiên bản SOAP - bởi vì nếu bạn đang cố gắng lấy bản đồ, thì đó là việc xây dựng một URL và lấy các byte hình ảnh từ URL đó dễ dàng hơn rất nhiều so với việc đóng gói nó vào một thông điệp SOAP. Nhưng vâng, tôi sẽ đồng ý rằng nếu quan điểm của dịch vụ web là chuyển một số đối tượng được gõ mạnh trong mô hình đối tượng miền, thì SOAP phù hợp hơn cho việc sử dụng đó.

  2. "Tại sao lại viết một dịch vụ REST trả về XML?"

    Vâng, vâng, điều đó có thể là ngớ ngẩn. Nhưng nó phụ thuộc vào XML là gì. Nếu có một lược đồ được xác định rõ ràng cho nó ở đâu đó, thì không có sự mơ hồ. Ví dụ: bạn có thể nghĩ URL WSDL là một loại dịch vụ web RESTful để truy xuất thông tin về dịch vụ web. Trong trường hợp này, việc thêm chi phí cho một yêu cầu SOAP khác sẽ là vô nghĩa.

    Nói chung, REST thắng khi nội dung đang được chuyển có thể được coi là một tệp, dưới dạng một đơn vị . SOAP chiến thắng khi nội dung cần được coi là một đối tượng với các thành viên .

  3. "Tôi đã nghe khiếu nại rằng với SOAP, bạn có" chi phí "của Phong bì SOAP. Trong thời đại ngày nay, chúng ta có thực sự cần phải lo lắng về một số byte không?"

    Đúng. Không phải trong mọi trường hợp, nhưng có những trang web có lưu lượng truy cập lớn, nơi nó tạo ra sự khác biệt. Có đủ khác biệt để vượt xa sự khác biệt về ngữ nghĩa của việc sử dụng SOAP thay vì REST không? Tôi nghi ngờ điều đó. Nếu bạn đang thực hiện một giao thức từ xa đối tượng và số byte đang tạo ra sự khác biệt, SOAP có thể không phải là công cụ dành cho bạn - dù sao thì có lẽ bạn nên sử dụng CORBA hoặc DCOM.

  4. "Tôi đã nghe lập luận rằng với REST, bạn có thể chỉ cần đưa URL vào trình duyệt và xem dữ liệu."

    Có, và đây là một đối số lớn có lợi cho REST nếu việc xem dữ liệu trong trình duyệt có ý nghĩa . Ví dụ: với dữ liệu hình ảnh, đây là một cách dễ dàng để gỡ lỗi dịch vụ - chỉ cần dán URL vào thanh địa chỉ của trình duyệt của bạn và xem hình ảnh trông như thế nào. Hoặc nếu dữ liệu được trả về là XML và bạn có biểu định kiểu XML được tham chiếu để hiển thị thành HTML có thể đọc được trong trình duyệt, thì bạn sẽ nhận được lợi ích của việc đánh dấu ngữ nghĩa và dễ dàng hiển thị tất cả trong một gói. Nhưng bạn đã đúng, lợi ích này chủ yếu bốc hơi khi làm việc với các chương trình xác thực phức tạp hơn. Nếu bạn không thể mã hóa tất cả thông tin xác thực của mình vào từng yêu cầu HTTP , thì tôi sẽ lập luận rằng nó hoàn toàn không được tính là REST.

  5. "Tại sao chúng ta cần một URL" có thể đọc được "cho mỗi tài nguyên? Nếu chúng ta đang sử dụng một công cụ để triển khai dịch vụ, chúng ta có thực sự quan tâm đến URL thực tế không?"

    Vâng, nó phụ thuộc. Tại sao chúng ta cần URL có thể đọc được cho bất kỳ tài nguyên nào trên web? Bạn có thể đọc bài tiểu luận Cool URIs của Tim Berners-Lee Không thay đổi cho lý do, nhưng về cơ bản, miễn là tài nguyên có thể vẫn hữu ích trong tương lai, URI cho tài nguyên đó sẽ giữ nguyên.

    Rõ ràng, đối với các tài nguyên nhất thời (như liên kết "Tiền ngày nay" trong bài tiểu luận) thì không cần đến nó, vì nhu cầu tham chiếu tài nguyên sẽ biến mất nếu tài nguyên tương ứng biến mất. Nhưng đối với các tài nguyên lâu dài hơn (ví dụ như câu hỏi StackOverflow hoặc phim trên IMDB), bạn muốn có một URL sẽ hoạt động mãi mãi. Khi bạn đang thiết kế một dịch vụ web, bạn cần phải quyết định xem liệu các tài nguyên có thể tồn tại lâu hơn dịch vụ của bạn hay không, và nếu vậy, thì REST có lẽ là cách phù hợp.

Đối với hồ sơ, vâng, tôi đã phát triển các trang web kể từ trước khi NetFlix hoặc Twitter tồn tại. Và không, tôi chưa có nhu cầu hoặc cơ hội để triển khai ứng dụng khách cho các dịch vụ của NetFlix hoặc Twitter. Nhưng ngay cả khi các dịch vụ của họ rất khó hoạt động, điều đó không có nghĩa là công nghệ mà họ triển khai dịch vụ của họ là xấu - chỉ có hai triển khai đó là xấu.

Để làm cho một câu chuyện dài ngắn: REST và SOAP chỉ là công cụ . Họ đều có điểm mạnh và điểm yếu. Nếu công cụ duy nhất bạn có là một cái búa, thì mọi vấn đề trông giống như một cái đinh. Vì vậy, hãy làm quen với cả hai công cụ và tìm hiểu cách sử dụng chúng một cách chính xác, sau đó chọn công cụ phù hợp cho từng công việc.


11
Hãy nhớ rằng SOAP không giới hạn ở HTTP, do đó sự trừu tượng hóa bổ sung. Tin nhắn kiểu SOAP có thể được sử dụng trên nhiều giao thức và do đó có phạm vi tiếp cận rộng hơn REST. Tôi nghĩ đó là một thực tế đơn giản mà nhiều người ủng hộ REST khó tính đôi khi không nhận ra. REST có vị trí của nó, nhưng SOAP cũng vậy.
jrista

4
@jrista: Điểm tốt. Không có gì sai với SOAP, giống như không có gì sai với búa, miễn là vấn đề của bạn thực sự là một cái đinh. Ngược lại, câu hỏi này dường như đang nói: "Tôi ghét tua vít! Tại sao không phải là một cái búa đủ tốt cho mọi người? Hãy thuyết phục tôi rằng tua vít nên tồn tại!" - mà, khi đặt trong bối cảnh đó, được tiết lộ cho sự vô lý của nó.
Daniel Pryden

2
REST là một phong cách kiến ​​trúc. Bạn có thể thực hiện các dịch vụ RESTful với SOAP, nếu bạn thực sự muốn. Tôi nghĩ rằng điều khó chịu chính mà cộng đồng REST đã chống lại SOAP wrt HTTP là SOAP nghĩ rằng HTTP là một giao thức truyền tải, trong khi đó là một giao thức truyền tải.
Bruno

@Daniel: Hoàn toàn đồng ý về câu hỏi trên ... câu hỏi khủng khiếp, và là một ví dụ lý tưởng về "chủ quan và lập luận" như nó nhận được, và chắc chắn không thể phi lý hơn. : PI sẽ tạo ra một sự khác biệt về SOAP tuy nhiên ... Tôi nghĩ rằng nó phù hợp với dự luật "con dao quân đội Thụy Sĩ" tốt hơn nhiều so với "búa". ; P
jrista

3
@Daniel Sheesh! Không có ý xúc phạm bất cứ ai. Đây là một cuộc điều tra trung thực vì tôi không nghĩ REST là phương pháp phù hợp cho các dịch vụ và dịch vụ như họ. Xin đừng viết ra câu hỏi của tôi từ cái nhìn đầu tiên. Tôi nghĩ rằng nó ổn khi "tranh luận" vì trong thực tế, tôi đang đặt ra một cuộc tranh luận. Tôi chỉ yêu cầu phản bác. Nói rằng REST "sử dụng web như được thiết kế để hoạt động", với tôi nghe như "trở lại thời của tôi trước tất cả các Twitters và Facebook ..." Bạn không đưa ra bất kỳ thông tin nào giải thích tại sao REST phù hợp với các loại này của dịch vụ. Quan tâm đến công phu?
Josh M.

17

Một câu hỏi trung thực xứng đáng có một câu trả lời trung thực. Nhưng trước tiên, tại sao bạn lại sử dụng văn bản của câu hỏi này như một câu trả lời cho câu hỏi khác nếu bạn không nghĩ rằng nó có tính khoa trương?

Dù sao:

  1. "Các công cụ tồn tại cho tất cả các ngôn ngữ / khung / nền tảng hiện đại để đọc trong WSDL và các lớp và máy khách proxy đầu ra. Việc triển khai dịch vụ REST được thực hiện bằng tay bằng cách đọc tài liệu. "

    Giống như các nhà cung cấp trình duyệt đã đọc và đọc lại đặc tả HTML 4.01 lên xuống để cố gắng thực hiện trải nghiệm duyệt phù hợp. Bạn đã phản ánh về thực tế rằng các trình duyệt đã được phát minh từ lâu trước khi ngân hàng internet và stackoverflow, tuy nhiên, bạn có thể sử dụng trình duyệt để làm những việc đó. Điều này được thực hiện vì lý do duy nhất là mọi người đồng ý sử dụng HTML (và các định dạng liên quan như CSS, JS, JPEG, v.v.).

    Viết blog thực sự không phải là mới, và ai đó đã nghĩ ra AtomPub, cho phép mọi phần mềm viết blog truy cập và cập nhật các bài đăng trong blog, giống như bất kỳ trình duyệt web nào cũng có thể truy cập bất kỳ trang web nào. Điều đó khá gọn gàng và hoạt động nhờ các ràng buộc RESTful được áp đặt bởi giao thức.

    Nhưng đối với Twitter và Netflix, không có thỏa thuận chung nào rằng "tất cả các blog nhỏ đang tồn tại sẽ sử dụng ứng dụng / tweet loại phương tiện truyền thông", chủ yếu là vì blog quá mới. Có thể trong một vài năm, một vài dịch vụ blog giải quyết trên cùng một API để Twitter, Facebook, Identica và có thể tương tác với nhau. Không có API hiện tại nào của họ ở bất kỳ nơi nào gần RESTful, tuy nhiên họ yêu cầu rất nhiều, vì vậy tôi không mong đợi điều đó sẽ xảy ra sớm.

    " Hơn nữa, trong khi thực hiện hai dịch vụ này, bạn phải đưa ra" dự đoán "về những gì sẽ quay trở lại qua đường ống vì không có lược đồ hoặc tài liệu tham khảo thực sự. "

    Bạn đã đánh vào đầu đinh. REST là tất cả về phân phối và hypermedia, và điều đó tổng hợp khá nhiều. Một trình duyệt xem xét những gì nó nhận được từ một yêu cầu và hiển thị nó cho người dùng. Một trang HTML thường sinh ra nhiều yêu cầu GET hơn, ví dụ CSS, tập lệnh và hình ảnh. Một hình ảnh thường chỉ được hiển thị trên màn hình, JavaScript được thực thi, v.v. Mỗi lần, trình duyệt thực hiện những gì nó làm vì nó tìm thấy liên kết trong một thẻ <img>hoặc <style>loại phương tiện phản hồi là image/jpeghoặc text/css.

    Nếu Twitter tạo API dựa trên hypermedia, nó có thể sẽ luôn trả về application/tweetmỗi khi bạn theo liên kết đến một tweet, nhưng khách hàng không bao giờ nên thừa nhận nó và luôn kiểm tra xem nó nhận được gì trước khi hành động.

  2. " Tại sao lại viết một dịch vụ REST trả về XML? "

    Tất cả điều này sôi xuống các loại phương tiện truyền thông. Giống như HTML, nếu bạn thấy một yếu tố mà bạn không biết ý nghĩa thực sự của nó là gì, thì thông số HTML hướng dẫn bạn bỏ qua chúng và xử lý "phần thân" của thẻ nếu nó có. Tương tự, thông số nguyên tử hướng dẫn bạn bỏ qua các yếu tố không xác định và đánh dấu nước ngoài (từ các không gian tên khác nhau) và không xử lý cơ thể (IIRC).

    Thiết kế các loại phương tiện cho các miền vấn đề chung (như trong loại phương tiện HTML cho miền vấn đề văn bản phong phú ) là rất khó. Tạo các loại phương tiện cho các miền có vấn đề rất hẹp có lẽ dễ dàng hơn nhiều (như một tweet). Nhưng luôn luôn là một ý tưởng tốt để thiết kế cho khả năng mở rộng và chỉ định cách khách hàng (và máy chủ) phải phản ứng khi họ thấy các yếu tố hoặc các mục dữ liệu không khớp với thông số kỹ thuật. JPEG, ví dụ, có loại bản ghi dành riêng cho Ứng dụng (ví dụ APP1) được sử dụng để chứa tất cả các loại dữ liệu meta.

  3. " Tôi đã nghe khiếu nại rằng với SOAP, bạn có" chi phí "của Phong bì SOAP. Trong thời đại ngày nay, chúng ta có thực sự cần phải lo lắng về một số byte không? "

    Không, chúng tôi không. Văn là hoàn toàn không phải là sự hiệu quả trên dây, nó thực sự giao dịch hiệu quả dây trong hiệu quả REST của nhân xuất phát từ khả năng của bộ nhớ đệm được kích hoạt bởi tất cả các hạn chế khác:. Luận án Fielding ghi chú: The trade-off, tuy nhiên, là một giao diện thống nhất phân hủy hiệu quả, vì thông tin được chuyển dưới dạng chuẩn chứ không phải thông tin cụ thể theo nhu cầu của ứng dụng. Giao diện REST được thiết kế để hoạt động hiệu quả để truyền dữ liệu hypermedia hạt lớn, tối ưu hóa cho trường hợp phổ biến của Web, nhưng dẫn đến giao diện không tối ưu cho các hình thức tương tác kiến ​​trúc khác. Tôi không nghĩ rằng chi phí đếm byte của Phong bì SOAP là một mối quan tâm hợp lệ.

  4. " Tôi đã nghe lập luận rằng với REST, bạn có thể chỉ cần đưa URL vào trình duyệt và xem dữ liệu. "

    Vâng, đó cũng là một đối số không hợp lệ. Nó không hoạt động theo cách đó. Ngay cả khi nó hoạt động, hầu hết các API REST hẹp ngoài kia đều sử dụng các loại phương tiện mà trình duyệt không biết và nó vẫn không hoạt động.

    Nhưng có nhiều khả năng hơn một trình duyệt để kiểm tra API dựa trên HTTP, như các tiện ích dòng lệnh hoặc tiện ích mở rộng trình duyệt cho phép bạn kiểm soát hầu hết mọi khía cạnh của yêu cầu HTTP, kiểm tra các tiêu đề phản hồi và khám phá các liên kết để bạn theo dõi. Nhưng ngay cả như vậy, điều này không dễ dàng như tạo ra các sơ khai WSDL và tạo một chương trình ba dòng để gọi hàm bằng mọi cách.

  5. " Tại sao chúng ta cần một URL" có thể đọc được "cho mỗi tài nguyên? Nếu chúng ta đang sử dụng một công cụ để triển khai dịch vụ, chúng ta có thực sự quan tâm đến URL thực tế không? "

    Nếu bạn nhìn vào cách thức hoạt động của web, tôi chắc chắn rằng con người rất vui vì URI cho một trang wikipedia trông như thế này, http://en.wikipedia.org/wiki/Stack_overflowthay vì http://en.wikipedia.org/wiki/?oldid=376349090. Nhưng nó thực sự không quan trọng đối với REST. Điều quan trọng để cố gắng làm đúng là chọn đặt dữ liệu có liên quan vào URI không có khả năng thay đổi. Bạn có thể nghĩ rằng ID cơ sở dữ liệu sẽ không bao giờ thay đổi, nhưng điều gì xảy ra khi hai bộ dữ liệu cần được hợp nhất? Tất cả các khóa chính của bạn thay đổi. Tiêu đề trang (Stack_overflow) sẽ không thay đổi.

Xin lỗi vì đã trả lời dài, nhưng tôi tin rằng câu hỏi này là hợp lệ và chưa được giải quyết trước đây trên SO. Tôi chắc chắn Darrel Miller sẽ thêm câu trả lời của mình một khi anh ấy cũng trở lại.

Chỉnh sửa: định dạng



3

WSDL và các giao thức cấp tài liệu khác là dự phòng. Giao thức HTTP hỗ trợ một tập hợp hoạt động phong phú hơn nhiều ngoài việc chỉ phục vụ tài liệu và gửi biểu mẫu.

Những người ủng hộ REST không thoải mái với sự dư thừa đó.


Điều đó không cho tôi biết lý do tại sao tôi nên sử dụng REST cho các loại dịch vụ này. Đối với tôi, nó không "phù hợp". Nói rằng "giao thức HTTP hỗ trợ một tập hợp hoạt động phong phú hơn nhiều ngoài việc chỉ phục vụ tài liệu và gửi biểu mẫu" không có nghĩa là chúng ta thực sự nên sử dụng chúng nếu có gì đó tốt hơn!
Josh M.

Điểm ngầm định tôi đã làm là REST là nạc. Nó hoạt động ở cấp độ giao thức (HTTP).
BC.
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.