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.