Chuyển trạng thái đại diện (REST) ​​và Giao thức truy cập đối tượng đơn giản (SOAP)


722

Ai đó có thể giải thích REST là gì và SOAP trong tiếng Anh đơn giản không? Và dịch vụ web hoạt động như thế nào?


5
Bạn phải đọc bản PDF này để hiểu các dịch vụ web REST và SOAP.
Lalit Kumar Maurya

2
Bạn có thể kiểm tra blog này javapapers.com/web-service/rest-vs-soap
spideringweb

1
Tôi có thể khuyên bạn nên đọc Luận văn của Fielding về chủ đề REST: ics.uci.edu/~fielding/pub/dissertation/rest_arch_style.htmlm
Philip Couling


1
@PhilipCouling Tôi sẽ không gọi bất kỳ luận án tiến sĩ nào bằng tiếng Anh ...
stt106

Câu trả lời:


1589

Giải thích đơn giản về SOAP và REST

SOAP - "Giao thức truy cập đối tượng đơn giản"

SOAP là một phương thức chuyển tin nhắn hoặc một lượng nhỏ thông tin qua Internet. Các thông báo SOAP được định dạng bằng XML và thường được gửi bằng HTTP (giao thức truyền siêu văn bản).


Nghỉ ngơi - Chuyển giao nhà nước đại diện

Nghỉ ngơi là một cách đơn giản để gửi và nhận dữ liệu giữa máy khách và máy chủ và nó không có nhiều tiêu chuẩn được xác định. Bạn có thể gửi và nhận dữ liệu dưới dạng JSON, XML hoặc thậm chí là văn bản thuần túy. Đó là trọng lượng nhẹ so với SOAP.


nhập mô tả hình ảnh ở đây


73
SOAP không chỉ là gửi dữ liệu trong một phong bì. Tuy nhiên, nó chủ yếu được sử dụng để gửi BLOB đến máy chủ, bỏ qua mọi tính năng mà SOAP cũng cung cấp. Về cơ bản, hầu hết mọi người sử dụng SOAP như REST với một phong bì tiêu chuẩn. (SOAP là một ví dụ điển hình về kỹ thuật quá mức)
elmuerte

15
SOAP KHÔNG CÓ CÁCH buộc người ta phải sử dụng HTTP hoặc XML. HTTP và XML là những thứ được định nghĩa trong WS-I về khả năng tương tác, nhưng người ta cũng có thể gửi POJO qua JMS. Vấn đề là, lập trình viên không cần quan tâm: Bus dịch vụ quản lý việc vận chuyển và mã hóa.
koppor

56
Đối với mọi vấn đề phức tạp, có một câu trả lời rõ ràng, đơn giản và sai. --HL Mencken
jmh

5
Ví dụ thật tuyệt vời!
Kaidul

18
HÃY ĐỌC TIẾP. Trong khi câu trả lời này mang tính giải trí @ câu trả lời của Pavel dưới đây đầy đủ hơn nhiều.
Josh Johnson

322

Cả hai phương pháp được sử dụng bởi nhiều người chơi lớn. Đó là một vấn đề ưu tiên. Sở thích của tôi là REST vì nó đơn giản hơn để sử dụng và hiểu.

Giao thức truy cập đối tượng đơn giản (SOAP):

  • SOAP xây dựng một giao thức XML trên HTTP hoặc đôi khi là TCP / IP.
  • SOAP mô tả các chức năng và các loại dữ liệu.
  • SOAP là sự kế thừa của XML-RPC và rất giống nhau, nhưng mô tả một cách tiêu chuẩn để giao tiếp.
  • Một số ngôn ngữ lập trình có hỗ trợ riêng cho SOAP, bạn thường cung cấp cho nó một URL dịch vụ web và bạn có thể gọi các chức năng dịch vụ web của nó mà không cần mã cụ thể.
  • Dữ liệu nhị phân được gửi trước tiên phải được mã hóa thành định dạng như mã hóa base64.
  • Có một số giao thức và công nghệ liên quan đến nó: WSDL, XSD, SOAP, WS-Địa chỉ

Chuyển trạng thái đại diện (REST):

  • REST không cần vượt quá HTTP nhưng hầu hết các điểm của tôi dưới đây sẽ có sai lệch HTTP.
  • REST rất nhẹ, nó nói hãy đợi một chút, chúng ta không cần tất cả sự phức tạp này mà SOAP tạo ra.
  • Thông thường sử dụng các phương thức HTTP thông thường thay vì định dạng XML lớn mô tả mọi thứ. Ví dụ: để có được tài nguyên bạn sử dụng HTTP GET, để đặt tài nguyên trên máy chủ bạn sử dụng HTTP PUT. Để xóa tài nguyên trên máy chủ, bạn sử dụng HTTP DELETE.
  • REST rất đơn giản ở chỗ nó sử dụng các phương thức HTTP GET, POST và PUT để cập nhật tài nguyên trên máy chủ.
  • REST thường được sử dụng tốt nhất với Kiến trúc hướng tài nguyên (ROA). Trong chế độ suy nghĩ này, mọi thứ đều là tài nguyên và bạn sẽ vận hành dựa trên những tài nguyên này.
  • Miễn là ngôn ngữ lập trình của bạn có thư viện HTTP và hầu hết đều làm như vậy, bạn có thể sử dụng giao thức REST HTTP rất dễ dàng.
  • Dữ liệu nhị phân hoặc tài nguyên nhị phân đơn giản có thể được cung cấp theo yêu cầu của họ.

những cuộc tranh luận bất tận về REST vs SOAP trên google .

Yêu thích của tôi là cái này . Cập nhật ngày 27 tháng 11 năm 2013: Trang web của Paul Prescod dường như đã ngoại tuyến và bài viết này không còn nữa, các bản sao có thể được tìm thấy trên Wayback Machine hoặc dưới dạng PDF tại CiteSeerX .


28
REST không liên quan gì đến HTTP (nó độc lập với giao thức) và XML rất tốt để sử dụng trong kiến ​​trúc RESTful. GET / POST / PUT / DELETE chỉ đơn giản là sử dụng HTTP chính xác - cần thiết cho REST nhưng không đủ.
aehlke

10
Làm thế nào khách hàng REST có thể biết những phương thức và loại anh ta có thể sử dụng? Trong SOAP có WSDL từ đó nhiều công cụ có thể tạo các lớp và phương thức.
jlp

3
@jlp: Tùy thuộc vào nhà phát triển ứng dụng khách REST sử dụng đúng giao diện REST được hiển thị.
Brian R. Bondy

14
REST chỉ đơn giản nói 'sử dụng giao diện thống nhất'. Vì Giao diện HTTP [GET, POST, PUT, DELETE, (CẬP NHẬT, ĐẦU)] đã trở thành 'giao diện thống nhất' của web, theo quan điểm của tôi, REST (trên web) bằng cách nào đó phụ thuộc vào HTTP!
Andre Schweighofer

3
@aehlke REST RẤT NHIỀU phụ thuộc vào HTTP. Nói khác đi là điên rồ. Cách tiếp cận REST được xác định chắc chắn thông qua RFC HTTP (bởi TAG W3C). Không có đặc điểm kỹ thuật nào khác của nó ngoài luận án tiến sĩ của Roy Fielding của UC Irvine. Xem: en.wikipedia.org/wiki/Repftimeatic_state_transfer
Brenden

259

NGHỈ NGƠI

Tôi hiểu ý tưởng chính của REST cực kỳ đơn giản. Chúng tôi đã sử dụng các trình duyệt web trong nhiều năm và chúng tôi đã thấy các trang web dễ dàng, linh hoạt, hiệu suất, v.v. Các trang web HTML sử dụng các siêu liên kết và biểu mẫu làm phương tiện chính cho sự tương tác của người dùng. Mục tiêu chính của họ là cho phép chúng tôi, khách hàng, chỉ biết những liên kết mà chúng tôi có thể sử dụng trong trạng thái hiện tại . Và REST chỉ đơn giản nói 'tại sao không sử dụng các nguyên tắc tương tự để điều khiển máy tính thay vì máy khách của con người thông qua ứng dụng của chúng tôi?' Kết hợp điều này với sức mạnh của cơ sở hạ tầng WWW và bạn sẽ có được một công cụ giết người để xây dựng các ứng dụng phân tán tuyệt vời.

Một lời giải thích có thể là cho những người suy nghĩ toán học. Mỗi ứng dụng về cơ bản là một bộ máy trạng thái với các hành động logic nghiệp vụ là các trạng thái chuyển tiếp. Ý tưởng của REST là ánh xạ mỗi chuyển đổi vào một số yêu cầu tới một tài nguyên và cung cấp cho khách hàng các liên kết đại diện cho các chuyển đổi có sẵn trong trạng thái hiện tại. Do đó, nó mô hình máy trạng thái thông qua các đại diện và liên kết. Đây là lý do tại sao nó được gọi là Chuyển giao Nhà nước REpresentational.

Thật đáng ngạc nhiên khi tất cả các câu trả lời dường như tập trung vào định dạng tin nhắn hoặc sử dụng động từ HTTP. Trên thực tế, định dạng thông báo hoàn toàn không thành vấn đề, REST có thể sử dụng bất kỳ ai cung cấp mà nhà phát triển dịch vụ cung cấp tài liệu đó. Động từ HTTP chỉ biến dịch vụ thành dịch vụ CRUD, nhưng chưa RESTful. Điều thực sự biến dịch vụ thành dịch vụ REST là các siêu liên kết (còn gọi là điều khiển hypermedia) được nhúng vào phản hồi của máy chủ cùng với dữ liệu và số tiền của chúng phải đủ để bất kỳ khách hàng nào chọn hành động tiếp theo từ các liên kết đó.

Thật không may, thật khó để tìm thấy thông tin chính xác về REST trên Web, ngoại trừ luận án của Roy Fielding . (Anh ấy là người bắt nguồn REST). Tôi muốn giới thiệu cuốn sách 'REST in Practice' vì nó cung cấp một hướng dẫn từng bước toàn diện về cách phát triển từ SOAP sang REST.

XÀ BÔNG

Đây là một trong những dạng có thể của kiểu kiến ​​trúc RPC (gọi thủ tục từ xa). Về bản chất, đó chỉ là một công nghệ cho phép khách hàng gọi các phương thức của máy chủ thông qua các ranh giới dịch vụ (mạng, quy trình, v.v.) như thể họ đang gọi các phương thức cục bộ. Tất nhiên, nó thực sự khác với việc gọi các phương thức cục bộ về tốc độ, độ tin cậy và vân vân, nhưng ý tưởng là đơn giản.

So

Các chi tiết như giao thức vận chuyển, định dạng tin nhắn, xsd, wsdl, v.v. không quan trọng khi so sánh bất kỳ dạng RPC nào với REST. Sự khác biệt chính là dịch vụ RPC phục hồi xe đạp bằng cách thiết kế giao thức ứng dụng của riêng nó trong API RPC với ngữ nghĩa mà chỉ có nó biết. Do đó, tất cả các khách hàng phải hiểu giao thức này trước khi sử dụng dịch vụ và không có cơ sở hạ tầng chung nào như bộ nhớ cache có thể được xây dựng do ngữ nghĩa độc quyền của tất cả các yêu cầu. Hơn nữa, API RPC không đề xuất những hành động nào được cho phép trong trạng thái hiện tại, điều này phải được lấy từ tài liệu bổ sung. Mặt khác, REST ngụ ý sử dụng các giao diện thống nhất để cho phép các khách hàng khác nhau hiểu một số ngữ nghĩa API và các điều khiển hypermedia (liên kết) để làm nổi bật các tùy chọn có sẵn ở mỗi trạng thái. Như vậy

Theo một cách nào đó, SOAP (như bất kỳ RPC nào khác) là một nỗ lực để vượt qua ranh giới dịch vụ coi phương tiện kết nối là một hộp đen chỉ có khả năng truyền tin nhắn. REST là một quyết định thừa nhận rằng Web là một hệ thống thông tin phân tán khổng lồ, chấp nhận thế giới như hiện tại và học cách làm chủ nó thay vì chiến đấu chống lại nó.

SOAP dường như rất tốt cho các API mạng nội bộ, khi bạn kiểm soát cả máy chủ và máy khách và trong khi các tương tác không quá phức tạp. Nó tự nhiên hơn cho các nhà phát triển sử dụng nó. Tuy nhiên, đối với API công khai được nhiều bên độc lập sử dụng, phức tạp và lớn, REST nên phù hợp hơn. Nhưng so sánh cuối cùng này là rất mờ nhạt.

Cập nhật

Kinh nghiệm của tôi đã bất ngờ cho thấy việc phát triển REST khó khăn hơn SOAP. Ít nhất là cho .NET. Mặc dù có các khung công tác tuyệt vời như ASP.NET Web API, nhưng không có công cụ nào có thể tự động tạo proxy phía máy khách. Không có gì giống như 'Thêm tham chiếu dịch vụ web' hoặc 'Thêm tham chiếu dịch vụ WCF'. Người ta phải viết tất cả các mã truy vấn nối tiếp và dịch vụ bằng tay. Và người đàn ông, đó là rất nhiều mã soạn sẵn. Tôi nghĩ rằng phát triển REST cần một cái gì đó tương tự như WSDL và triển khai công cụ cho mỗi nền tảng phát triển. Trên thực tế, dường như có một nền tảng tốt: WADL hoặc WSDL 2.0 , nhưng cả hai tiêu chuẩn dường như không được hỗ trợ tốt.

Cập nhật (tháng 1 năm 2016)

Hóa ra hiện nay có rất nhiều công cụ để định nghĩa API REST. Sở thích cá nhân của tôi hiện tại là RAML .

Dịch vụ web hoạt động như thế nào

Vâng, đây là một câu hỏi quá rộng, bởi vì nó phụ thuộc vào kiến ​​trúc và công nghệ được sử dụng trong dịch vụ web cụ thể. Nhưng nói chung, một dịch vụ web chỉ đơn giản là một số ứng dụng trong Web có thể chấp nhận các yêu cầu từ khách hàng và trả lời phản hồi. Nó được tiếp xúc với Web, do đó, đây là một dịch vụ web và thường có sẵn 24/7, đó là lý do tại sao nó là một dịch vụ . Tất nhiên, nó giải quyết một số vấn đề (nếu không thì tại sao ai đó sẽ sử dụng dịch vụ web) cho khách hàng của mình.


45
Đây sẽ là câu trả lời được đánh giá cao nhất cho đến nay! Tôi có khiếu hài hước, nhưng thật đáng buồn khi những câu trả lời hài hước trên StackOverflow được đánh giá cao.
Hội trường Tom W

3
@TomHall Tôi đoán tình huống này hơi cụ thể đối với thảo luận REST - RPC, không chỉ trên SO. Tôi đoán đó là lý do chúng tôi không có công cụ hợp lý cho các máy khách REST. Ít nhất là trên .NET, việc triển khai ứng dụng khách dịch vụ REST đã tỏ ra khó khăn hơn nhiều so với việc tạo tham chiếu dịch vụ SOAP. Người ta phải viết các lớp proxy bằng tay. Vì một số lý do, mọi người nghĩ về REST như thể không có quy tắc nào cả, trong khi ý tưởng ban đầu ngược lại đặt ra nhiều hạn chế hơn đối với kiến ​​trúc. Tôi mong muốn cộng đồng hiểu REST - sau đó chúng ta có thể mong đợi công cụ và việc áp dụng tốt hơn.
Pavel Gatilov

2
@PavelGatilov Câu trả lời này rất hay. Tôi đã đọc các giải thích REST khác và không bao giờ "hiểu" rằng nguyên tắc lái xe là các chuyển đổi trạng thái có thể là một phần của phản ứng. Việc bạn dành thời gian để suy nghĩ lại về trải nghiệm của mình và thừa nhận những khó khăn cũng có giá trị lớn đối với mọi người chúng ta.

Câu trả lời tuyệt vời. Tôi tự hỏi sẽ mất bao lâu để REST-I phát triển bây giờ khi nó bắt đầu trông ngày càng nhiều SOAP như với RAML, Swagger và WADL đưa nó ra cho tiêu chuẩn thực tế là REST. Tôi thấy việc thiếu công cụ trên REST so với SOAP là một nỗi đau lớn khi phát triển một số hệ thống tài chính khá nhạy cảm và phức tạp. Cả REST và SOAP đều tuyệt vời khi được sử dụng đúng cách. Ông tôi luôn nói rằng bạn có thể sử dụng một cái tuốc nơ vít để đóng đinh nhưng nó không hoạt động tốt. Áp dụng tương tự ở đây. Công cụ phù hợp cho tâm lý công việc không phải là cách của tôi là cách duy nhất. \
Namphibian

Ồ tôi cũng thích RAML và tôi thích phát triển từ trên xuống, điều tôi cảm thấy lo lắng nhất về REST là thiếu cách tiếp cận từ trên xuống có cấu trúc. Tôi thích suy nghĩ trước khi hành động.
Namphibian


38

SOAP - Giao thức truy cập đối tượng đơn giản là một giao thức !

REST - Chuyển giao nhà nước liên quan là một phong cách kiến ​​trúc !

SOAP là một giao thức XML được sử dụng để truyền tin nhắn, thường là qua HTTP

RESTSOAPđược cho là không loại trừ lẫn nhau. Một kiến ​​trúc RESTful có thể sử dụng HTTPhoặc SOAPhoặc một số giao thức truyền thông khác. RESTđược tối ưu hóa cho web và do đó HTTPlà một lựa chọn hoàn hảo. HTTPcũng là giao thức duy nhất được thảo luận trong bài báo của Roy Fielding.

Mặc dù REST và SOAP rõ ràng rất khác nhau, nhưng câu hỏi làm sáng tỏ thực tế đó RESTHTTPthường được sử dụng song song. Điều này chủ yếu là do sự đơn giản của HTTP và ánh xạ rất tự nhiên của nó theo các nguyên tắc RESTful.

Nguyên tắc REST cơ bản

Giao tiếp giữa máy khách và máy chủ

Kiến trúc máy khách-máy chủ có một mối quan tâm rất riêng biệt. Tất cả các ứng dụng được xây dựng theo kiểu RESTful cũng phải là máy khách-máy chủ trong hoàng tử.

Không quốc tịch

Mỗi yêu cầu của máy khách đến máy chủ yêu cầu trạng thái của nó được thể hiện đầy đủ. Máy chủ phải có thể hiểu hoàn toàn yêu cầu của máy khách mà không cần sử dụng bất kỳ bối cảnh máy chủ hoặc trạng thái phiên máy chủ nào. Nó theo sau rằng tất cả các trạng thái phải được giữ trên máy khách. Chúng tôi sẽ thảo luận về đại diện không quốc tịch chi tiết hơn sau.

Bộ nhớ cache

Các ràng buộc bộ đệm có thể được sử dụng, do đó cho phép dữ liệu phản hồi được đánh dấu là có thể lưu trong bộ nhớ cache hoặc không lưu trong bộ nhớ cache. Bất kỳ dữ liệu nào được đánh dấu là có thể lưu trong bộ nhớ cache có thể được sử dụng lại làm phản hồi cho cùng một yêu cầu tiếp theo.

Giao diện thống nhất

Tất cả các thành phần phải tương tác thông qua một giao diện thống nhất duy nhất. Bởi vì tất cả các tương tác thành phần xảy ra thông qua giao diện này, tương tác với các dịch vụ khác nhau rất đơn giản. Giao diện giống nhau! Điều này cũng có nghĩa là những thay đổi thực hiện có thể được thực hiện một cách cô lập. Những thay đổi như vậy, sẽ không ảnh hưởng đến tương tác thành phần cơ bản vì giao diện thống nhất luôn không thay đổi. Một nhược điểm là bạn bị kẹt với giao diện. Nếu tối ưu hóa có thể được cung cấp cho một dịch vụ cụ thể bằng cách thay đổi giao diện, bạn sẽ không gặp may vì REST cấm điều này. Tuy nhiên, về mặt sáng sủa, REST được tối ưu hóa cho web, do đó mức độ phổ biến đáng kinh ngạc của REST so với HTTP!

Các khái niệm trên thể hiện các đặc điểm xác định của REST và phân biệt kiến ​​trúc REST với các kiến ​​trúc khác như các dịch vụ web. Rất hữu ích khi lưu ý rằng dịch vụ REST là dịch vụ web, nhưng dịch vụ web không nhất thiết phải là dịch vụ REST.

Xem bài đăng trên blog này về Hiệu trưởng thiết kế REST để biết thêm chi tiết về REST và các viên đạn đã nêu ở trên.


Chỉ cần nghĩ rằng sẽ hoàn toàn HATEOAS để yêu cầu tài nguyên RESTful và nhận được phản hồi bao gồm liên kết đến WSDL mô tả những hoạt động nào có sẵn trên tài nguyên đó ở trạng thái hiện tại. Mặc dù tôi đoán rằng một dịch vụ web RESTAP SOAP sẽ hơi giống như bỏ qua RMM cấp 3 và đi thẳng đến cấp 4. :)
Steve

3
Đây là câu trả lời tốt nhất để phản ánh rằng nó không phải / hoặc với REST và SOAP. +1 để lưu ý rằng REST là một phong cách .
ABMagil

12

Tôi thích câu trả lời của Brian R. Bondy. Tôi chỉ muốn thêm rằng Wikipedia cung cấp một mô tả rõ ràng về REST . Bài viết phân biệt nó với SOAP.

REST là một trao đổi thông tin trạng thái, được thực hiện đơn giản nhất có thể.

SOAP là một giao thức tin nhắn sử dụng XML.

Một trong những lý do chính khiến nhiều người chuyển từ SOAP sang REST là các tiêu chuẩn WS- * (được gọi là WS splat) được liên kết với các dịch vụ web dựa trên SOAP rất phức tạp. Xem wikipedia để biết danh sách các thông số kỹ thuật. Mỗi thông số kỹ thuật là rất phức tạp.

EDIT: vì một số lý do các liên kết không hiển thị chính xác. REST = http://en.wikipedia.org/wiki/REST

WS- * = http://en.wikipedia.org/wiki/WS- *


SOAP KHÔNG phải là một giao thức. SOAP là về mã hóa. SOAP được sử dụng trên nhiều giao thức: JMS, http, ...
koppor

16
@koppor Ý bạn là khác với thực tế là nó là viết tắt của "Giao thức truy cập đối tượng đơn giản"? Ngoài ra, bạn có biết giao thức là gì không? Một giao thức về cơ bản là một tập hợp các quy tắc về cách hai hoặc nhiều thứ nên giao tiếp, đó chính xác là những gì SOAP dành cho, một cách tiêu chuẩn để giao tiếp.
kyrias

4
@Demizey Bạn có đề cập đến phiên bản SOAP mới nhất, phiên bản 1.2 không? w3.org/TR/soap12-part1 "SOAP" hiện đứng riêng vì trong thực tế, nó KHÔNG được sử dụng làm giao thức. "SOAP 1.2 sẽ không đánh vần từ viết tắt." ( w3.org/TR/2007/REC-soap12-part0-20070427/#L4697 ) Bạn có biết các lớp của ngăn xếp Dịch vụ web như (ví dụ) được mô tả trong Sách "Kiến trúc nền tảng dịch vụ web: Xà phòng, Wsdl, Ws -Policy, Ws-Địa chỉ, Ws-Bpel, Ws-Nhắn tin đáng tin cậy, và nhiều hơn nữa "? Giao tiếp tầng vận chuyển được thực hiện thông qua HTTP, SMTP, RMI / IIOP, JMS hoặc các loại khác. SOAP được sử dụng trong lớp nhắn tin
koppor

Dọc theo đường kết nối SOAP, nhiều trung gian có thể ngồi giữa. Điều này được kích hoạt bởi mô hình xử lý SOAP, phân biệt giữa người nhận SOAP cuối cùng và không hoặc nhiều trung gian SOAP. Giao thức vận chuyển có thể thay đổi giữa. Đường dẫn thông báo SOAP cũng cho phép triển khai minh bạch các mẫu EAI ( eaipotypes.com )
koppor

12
Nó vẫn là một giao thức nhắn tin.
kyrias

7

Cả dịch vụ web SOAP và dịch vụ web REST đều có thể sử dụng giao thức HTTP và các giao thức khác (chỉ cần đề cập đến SOAP có thể là giao thức cơ bản của REST). Tôi sẽ chỉ nói về giao thức HTTP liên quan đến SOAP và REST, vì đây là cách sử dụng chúng thường xuyên nhất.

XÀ BÔNG

SOAP (giao thức truy cập đối tượng "đơn giản") là một giao thức (và tiêu chuẩn W3C ). Nó định nghĩa cách tạo, gửi và xử lý tin nhắn SOAP.

  • Các thông báo SOAP là các tài liệu XML có cấu trúc cụ thể: chúng chứa một phong bì chứa phần tiêu đề và phần thân. Phần thân chứa dữ liệu thực tế - chúng tôi muốn gửi - theo định dạng XML. Có hai kiểu mã hóa , nhưng chúng tôi thường chọn bằng chữ , điều đó có nghĩa là ứng dụng của chúng tôi hoặc trình điều khiển SOAP của nó thực hiện tuần tự hóa XML và không xác định dữ liệu.

  • Các thông báo SOAP di chuyển dưới dạng các thông điệp HTTP với tiểu loại SOAP + XML MIME. Các thông điệp HTTP này có thể là nhiều phần, do đó, tùy chọn chúng ta có thể đính kèm các tệp vào các thông báo SOAP.

  • Rõ ràng chúng tôi sử dụng kiến ​​trúc máy khách-máy chủ, vì vậy các máy khách SOAP gửi yêu cầu đến các weberer SOAP và các dịch vụ gửi lại phản hồi cho khách hàng. Hầu hết các dịch vụ web sử dụng tệp WSDL để mô tả dịch vụ. Tệp WSDL chứa Lược đồ XML (sau đây là XSD) của dữ liệu chúng tôi muốn gửi và liên kết WSDL xác định cách thức dịch vụ web được liên kết với giao thức HTTP. Có hai kiểu ràng buộc: RPC và tài liệu. Theo kiểu RPC ràng buộc, thân SOAP chứa biểu diễn của một lệnh gọi hoạt động với các tham số (yêu cầu HTTP) hoặc các giá trị trả về (phản hồi HTTP). Các tham số và giá trị trả về được xác nhận theo XSD. Theo kiểu tài liệu ràng buộc phần thân SOAP chứa một tài liệu XML được xác nhận hợp lệ với XSD. Tôi nghĩ rằng kiểu liên kết tài liệu phù hợp hơn với các hệ thống dựa trên sự kiện, nhưng tôi không bao giờ sử dụng kiểu liên kết đó. Kiểu liên kết RPC phổ biến hơn, vì vậy hầu hết mọi người sử dụng SOAP cho các mục đích XML / RPC bởi các ứng dụng phân tán. Các dịch vụ web thường tìm thấy nhau bằng cách yêu cầu máy chủ UDDI . Máy chủ UDDI là cơ quan đăng ký lưu trữ vị trí của dịch vụ web.

RAP SOAP

Vì vậy, theo ý kiến ​​của tôi - dịch vụ web SOAP phổ biến nhất sử dụng kiểu liên kết RPC và kiểu mã hóa theo nghĩa đen và nó có các thuộc tính sau:

  • Nó ánh xạ URL để hoạt động.
  • Nó gửi tin nhắn với kiểu con SOIME + XML MIME.
  • Nó có thể có một cửa hàng phiên máy chủ, không có ràng buộc về điều đó.
  • Các trình điều khiển máy khách SOAP sử dụng tệp WSDL của dịch vụ để chuyển đổi các hoạt động RPC thành các phương thức. Ứng dụng phía máy khách giao tiếp với dịch vụ web SOAP bằng cách gọi các phương thức này. Vì vậy, hầu hết các máy khách SOAP bị phá vỡ bởi các thay đổi giao diện (kết quả là tên phương thức và / hoặc thay đổi tham số).
  • Có thể viết các ứng dụng khách SOAP sẽ không phá vỡ các thay đổi giao diện bằng RDF và tìm các hoạt động theo ngữ nghĩa, nhưng dịch vụ web ngữ nghĩa là rất hiếm và chúng không nhất thiết phải có một máy khách không phá vỡ (tôi đoán vậy).

NGHỈ NGƠI

REST (chuyển trạng thái đại diện) là một kiểu kiến ​​trúc được mô tả trong luận văn của Roy Fielding. Nó không quan tâm đến các giao thức như SOAP. Nó bắt đầu với một kiểu kiến ​​trúc null không có ràng buộc và xác định các ràng buộc của kiến ​​trúc REST từng cái một. Mọi người sử dụng thuật ngữ RESTful cho các dịch vụ web đáp ứng tất cả các ràng buộc REST, nhưng theo Roy Fielding, không có những thứ như cấp độ REST . Khi một dịch vụ web không đáp ứng với mọi ràng buộc REST, thì đó không phải là dịch vụ web REST.

Ràng buộc REST

  • Kiến trúc máy khách - máy chủ - Tôi nghĩ phần này quen thuộc với mọi người. Các máy khách REST giao tiếp với các dịch vụ web REST, các dịch vụ web duy trì dữ liệu chung - trạng thái tài nguyên sau đây - và phục vụ nó cho các máy khách.
  • Không quốc tịch - Phần "chuyển trạng thái" của chữ viết tắt: REST. Các máy khách duy trì trạng thái máy khách (trạng thái phiên / ứng dụng), do đó các dịch vụ không được có bộ lưu trữ phiên. Các máy khách chuyển phần có liên quan của trạng thái máy khách theo mọi yêu cầu đến các dịch vụ đáp ứng với phần có liên quan của trạng thái tài nguyên (được duy trì bởi chúng). Vì vậy, các yêu cầu không có ngữ cảnh, chúng luôn chứa thông tin cần thiết để xử lý chúng. Ví dụ: HTTP cơ bản xác thực tên người dùng và mật khẩu được lưu trữ bởi khách hàng và nó sẽ gửi chúng với mọi yêu cầu, vì vậy xác thực xảy ra bởi mọi yêu cầu. Điều này rất khác với các ứng dụng web thông thường nơi xác thực chỉ xảy ra bằng cách đăng nhập. Chúng tôi có thể sử dụng bất kỳ cơ chế lưu trữ dữ liệu phía máy khách nào như trong bộ nhớ (javascript), cookie, localStorage, v.v. để duy trì một số phần của trạng thái máy khách nếu chúng ta muốn. Lý do của sự hạn chế không trạng thái, rằng máy chủ có quy mô tốt - thậm chí với tải rất cao (hàng triệu người dùng) - khi nó không phải duy trì phiên của mỗi khách hàng.
  • Bộ nhớ cache - Phản hồi phải chứa thông tin về nó có thể được lưu trữ bởi khách hàng hay không. Điều này cải thiện khả năng mở rộng hơn nữa.
  • Giao diện thống nhất

    • Xác định tài nguyên - Tài nguyên REST giống như tài nguyên RDF . Theo Fielding nếu bạn có thể đặt tên cho một cái gì đó, thì đó có thể là tài nguyên, ví dụ: "thời tiết địa phương hiện tại" có thể là tài nguyên hoặc "điện thoại di động của bạn" có thể là tài nguyên hoặc "tài liệu web cụ thể" có thể là một nguồn lực. Để xác định tài nguyên, bạn có thể sử dụng số nhận dạng tài nguyên: URL và URN (ví dụ: số ISBN theo sách ). Một mã định danh duy nhất chỉ nên thuộc về một tài nguyên cụ thể, nhưng một tài nguyên duy nhất có thể có nhiều mã định danh, mà chúng tôi thường khai thác ví dụ bằng cách phân trang với các URL như https://example.com/api/v1/users?offset=50&count=25. URL có một số thông số kỹ thuật, ví dụ: các URL có cùng đường dẫn nhưng các truy vấn khác nhau không giống nhau hoặc phần đường dẫn phải chứa dữ liệu chữ tượng hình của URL và phần truy vấn sẽ chứa dữ liệu không phân cấp. Đây là những điều cơ bản về cách tạo URL bằng REST. Btw. cấu trúc URL chỉ quan trọng đối với các nhà phát triển dịch vụ, một khách hàng REST thực sự không quan tâm đến nó. Một câu hỏi thường gặp khác là phiên bản API, đây là một câu hỏi dễ, bởi vì theo Fielding, điều duy nhất không đổi theo tài nguyên là ngữ nghĩa. Nếu ngữ nghĩa thay đổi, thì bạn có thể thêm số phiên bản mới. Bạn có thể sử dụng phiên bản 3 số cổ điển và chỉ thêm số chính vào các URL (https://example.com/api/v1/). Vì vậy, bằng những thay đổi tương thích ngược, không có gì xảy ra, bởi những thay đổi không tương thích ngược, bạn sẽ có một ngữ nghĩa tương thích không ngược với một gốc API mới https://example.com/api/v2/. Vì vậy, các khách hàng cũ sẽ không phá vỡ, bởi vì họ có thể sử dụng https://example.com/api/v1/với ngữ nghĩa cũ.
    • Thao tác tài nguyên thông qua các biểu diễn - Bạn có thể thao tác dữ liệu liên quan đến tài nguyên (trạng thái tài nguyên) bằng cách gửi đại diện dự định của tài nguyên - cùng với phương thức HTTP và mã định danh tài nguyên - đến dịch vụ REST. Ví dụ: nếu bạn muốn đổi tên người dùng sau khi kết hôn, bạn có thể gửi PATCH https://example.com/api/v1/users/1 {name: "Mrs Smith"}yêu cầu trong đó {name: "Mrs Smith"}đại diện JSON của trạng thái tài nguyên dự định, nói cách khác: tên mới. Điều này xảy ra vica-ngược lại, dịch vụ gửi đại diện tài nguyên cho khách hàng để thay đổi trạng thái của họ. Ví dụ: nếu chúng tôi muốn đọc tên mới, chúng tôi có thể gửi GET https://example.com/api/v1/users/1?fields="name"yêu cầu truy xuất, kết quả là200 ok, {name: "Mrs Smith"}phản ứng. Vì vậy, chúng tôi có thể sử dụng đại diện này để thay đổi trạng thái máy khách, ví dụ: chúng tôi có thể hiển thị "Chào mừng bạn đến trang của chúng tôi, bà Smith!" thông điệp. Một tài nguyên có thể có nhiều biểu diễn tùy thuộc vào mã định danh tài nguyên (URL) hoặc accepttiêu đề chúng tôi đã gửi với yêu cầu. Ví dụ: chúng tôi có thể gửi hình ảnh của bà Smith (có thể không khỏa thân) nếu image/jpegđược yêu cầu.
    • Tin nhắn tự mô tả - Tin nhắn phải chứa thông tin về cách xử lý chúng. Ví dụ: phương pháp URI và HTTP, tiêu đề kiểu nội dung, tiêu đề bộ đệm, RDF mô tả ý nghĩa của dữ liệu, v.v ... Điều quan trọng là sử dụng các phương thức tiêu chuẩn. Điều quan trọng là phải biết đặc điểm kỹ thuật của các phương thức HTTP. Ví dụ: GET có nghĩa là truy xuất thông tin được xác định bởi URL yêu cầu, XÓA có nghĩa là yêu cầu máy chủ xóa tài nguyên được xác định bởi URL đã cho, v.v ... Mã trạng thái HTTP cũng có một đặc tả , ví dụ 200 có nghĩa là thành công, 201 có nghĩa là tài nguyên mới đã được tạo, 404 có nghĩa là không tìm thấy tài nguyên được yêu cầu trên máy chủ, v.v ... Sử dụng các tiêu chuẩn hiện có là một phần quan trọng của REST.
    • Hypermedia là công cụ của trạng thái ứng dụng (HATEOAS sau đây) - Hypermedia là một loại phương tiện có thể chứa các siêu liên kết. Bằng web, chúng tôi theo các liên kết - được mô tả bằng định dạng hypermedia (thường là HTML) - để đạt được mục tiêu, thay vì nhập URL vào thanh địa chỉ. REST theo cùng một khái niệm, các đại diện được gửi bởi dịch vụ có thể chứa các siêu liên kết. Chúng tôi sử dụng các siêu liên kết này để gửi yêu cầu đến dịch vụ. Với phản hồi, chúng tôi nhận được dữ liệu (và có thể nhiều liên kết hơn) mà chúng tôi có thể sử dụng để xây dựng trạng thái máy khách mới, v.v ... Vậy đó là lý do tại sao hypermedia là công cụ của trạng thái ứng dụng (trạng thái máy khách). Bạn có thể tự hỏi làm thế nào để khách hàng nhận ra và theo các siêu liên kết? Bởi con người khá đơn giản, chúng tôi đọc tiêu đề của liên kết, có thể điền vào các trường đầu vào và sau đó chỉ bằng một cú nhấp chuột.JSON-LD với Hydra ) hoặc với các giải pháp cụ thể của hypermedia (ví dụ: quan hệ liên kết IANAcác loại MIME cụ thể của nhà cung cấp theo HAL + JSON ). Có nhiều định dạng hypermedia XMLJSON có thể đọc được bằng máy , chỉ là một danh sách ngắn của chúng:

      Đôi khi thật khó để chọn ...

  • Hệ thống phân lớp - Chúng tôi có thể sử dụng nhiều lớp giữa máy khách và dịch vụ. Không ai trong số họ nên biết về tất cả các lớp bổ sung này, chỉ là lớp ngay bên cạnh nó. Các lớp này có thể cải thiện khả năng mở rộng bằng cách áp dụng bộ nhớ cache và cân bằng tải hoặc chúng có thể thực thi các chính sách bảo mật.
  • Mã theo yêu cầu - Chúng tôi có thể gửi lại mã mở rộng chức năng của máy khách, ví dụ mã javascript đến trình duyệt. Đây là ràng buộc tùy chọn duy nhất của REST.

Dịch vụ web REST - Sự khác biệt về dịch vụ web SOAP RPC

Vì vậy, một dịch vụ web REST rất khác với dịch vụ web SOAP (với kiểu liên kết RPC và kiểu mã hóa theo nghĩa đen)

  • Nó định nghĩa một giao diện thống nhất (intead của một giao thức).
  • Nó ánh xạ URL tới tài nguyên (và không hoạt động).
  • Nó gửi tin nhắn với bất kỳ loại MIME nào (thay vì chỉ SOAP + XML).
  • Nó có một giao tiếp phi trạng thái, và do đó nó không thể có bộ lưu trữ phiên phía máy chủ. (SOAP không có ràng buộc về điều này)
  • Nó phục vụ hypermedia và khách hàng sử dụng các liên kết có trong hypermedia đó để yêu cầu dịch vụ. (SOAP RPC sử dụng các ràng buộc hoạt động được mô tả trong tệp WSDL)
  • Nó không phá vỡ bởi các thay đổi URL chỉ bởi những thay đổi ngữ nghĩa. (Các máy khách SOAP RPC mà không sử dụng ngữ nghĩa RDF bị phá vỡ bởi các thay đổi tệp WSDL.)
  • Nó mở rộng tốt hơn dịch vụ web SOAP vì hành vi không trạng thái của nó.

và như thế...

Dịch vụ web SOAP RPC không đáp ứng tất cả các ràng buộc REST:

  • kiến trúc máy khách-máy chủ - luôn luôn
  • không trạng thái - có thể
  • bộ nhớ cache - có thể
  • giao diện thống nhất - không bao giờ
  • hệ thống lớp - không bao giờ
  • mã theo yêu cầu (tùy chọn) - có thể

6

Vâng, tôi sẽ bắt đầu với câu hỏi thứ hai: Dịch vụ web là gì? , vì lý do rõ ràng.

Dịch vụ web về cơ bản là các phần logic (mà bạn có thể mơ hồ gọi là một phương thức) phơi bày chức năng hoặc dữ liệu nhất định. Máy khách thực hiện (nói về mặt kỹ thuật, tiêu thụ là từ) chỉ cần biết (các) tham số mà phương thức sẽ chấp nhận và loại dữ liệu mà nó sẽ trả về (nếu có).

Liên kết sau đây nói lên tất cả về REST & SOAP một cách cực kỳ sáng suốt.

REST vs SOAP

Nếu bạn cũng muốn biết khi nào nên chọn cái gì (REST hoặc SOAP), tất cả lý do để đi qua nó!


5

Cả SOAP và REST đều đề cập đến các cách để các hệ thống khác nhau nói chuyện với nhau.

REST thực hiện điều này bằng cách sử dụng các kỹ thuật tương tự như giao tiếp mà trình duyệt của bạn có với các máy chủ web: sử dụng GET để yêu cầu một trang web, POST trong các trường mẫu, v.v.

SOAP cung cấp một cái gì đó tương tự nhưng thực hiện mọi thứ thông qua việc gửi các khối XML qua lại. Một thành phần quan trọng khác của SOAP là WSDL là một tài liệu XML mô tả các chức năng và thành phần dữ liệu nào được hỗ trợ. WSDL có thể được sử dụng để "khám phá" lập trình những chức năng nào được hỗ trợ cũng như để tạo ra các sơ đồ mã lập trình.


1
Điều đó không liên quan gì đến REST, đó chỉ là "cách sử dụng HTTP chính xác"
aehlke

Bản thân HTTP là ví dụ tốt nhất về hệ thống RESTful.
poustitenbach

1
@pbreitenbach Không, HTTP thì không, về cơ bản nó không có khái niệm về hypermedia. Nhưng HTML với các siêu liên kết và biểu mẫu của nó là một hệ thống RESTful. Trên thực tế, đó là nguyên mẫu của 'đặc tả' REST
Pavel Gatilov

SOAP KHÔNG buộc bạn phải sử dụng mã hóa XML. Mã hóa XML chỉ được sử dụng nếu một dịch vụ cung cấp khả năng tương tác. Trong nội bộ, POJO có thể được gửi mà không có mã hóa bằng XML.
koppor

2

Tôi nghĩ rằng điều này là dễ dàng như tôi có thể giải thích nó. Xin vui lòng, bất cứ ai cũng được chào đón để sửa chữa tôi hoặc thêm vào điều này.

SOAP là một định dạng tin nhắn được sử dụng bởi các hệ thống bị ngắt kết nối (như trên internet) để trao đổi thông tin / dữ liệu. Nó thực hiện với các thông điệp XML qua lại.

Dịch vụ web truyền hoặc nhận tin nhắn SOAP. Chúng hoạt động khác nhau tùy thuộc vào ngôn ngữ chúng được viết.


Xây dựng ý nghĩa của bạn bằng cách "họ làm việc khác nhau". SOAP thường được sử dụng như một cách để các hệ thống khác nhau được viết bằng các công nghệ khác nhau hoặc chưa biết nói chuyện bằng một ngôn ngữ dễ hiểu với các tham số được xác định rõ ràng.
MyItchyChin

Các dịch vụ web hoạt động khác nhau tùy thuộc vào ngôn ngữ chúng được viết. Chỉ là một chi tiết bổ sung không quan trọng.
StingyJack

Ok, tôi không chắc nếu bạn ngụ ý có gì đó ngăn cản khả năng tương tác.
MyItchyChin

2

Vấn đề với SOAP là nó mâu thuẫn với những lý tưởng đằng sau ngăn xếp HTTP. Bất kỳ phần mềm trung gian nào cũng có thể hoạt động với các yêu cầu HTTP mà không hiểu nội dung của yêu cầu hoặc phản hồi, nhưng ví dụ, máy chủ bộ đệm HTTP thông thường sẽ không hoạt động với các yêu cầu SOAP mà không biết phần nào của nội dung SOAP cho bộ đệm. SOAP chỉ sử dụng HTTP làm trình bao bọc cho giao thức truyền thông của riêng mình, như proxy.


2
Nó chống lại những lý tưởng, và chúng tôi chỉ nhận thấy điều đó. Nó đã được khoảng từ năm 1998 hoặc lâu hơn, và chúng tôi chỉ đang chọn nó. Chết tiệt, chúng tôi choáng váng!
John Saunders

Không John, "chúng tôi" là cộng đồng nhà phát triển web có hiểu biết, đã biết tất cả cùng. Đó chỉ là những người chậm chạp và những người sắp ra trường CS mà không có một nền giáo dục đúng đắn vừa mới ra mắt.
Nicholas Shanks

"Chúng tôi" không phải là tất cả các nhà phát triển web. Một số người trong chúng ta chỉ đang cố gắng hoàn thành công việc theo cách tốt nhất có thể và không quan tâm nếu chúng ta "không sử dụng hết tiềm năng của web".
John Saunders

"choáng váng" chỉ về tổng hợp nó, yeah.
Rob Grant

2

REST là một kiểu kiến ​​trúc để thiết kế các ứng dụng nối mạng. Ý tưởng là, thay vì sử dụng các cơ chế phức tạp như CORBA, RPC hoặc SOAP để kết nối giữa các máy, HTTP đơn giản được sử dụng để thực hiện cuộc gọi giữa các máy.


1

SOAP - "Giao thức truy cập đối tượng đơn giản"

SOAP là một chút chuyển tin nhắn, hoặc một lượng nhỏ thông tin qua Internet. Các thông báo SOAP được định dạng bằng XML và thường được gửi kiểm soát HTTP .

REST - "Chuyển giao nhà nước liên quan"

REST là một tiến trình thô sơ của tình huống và nhận thông tin giữa người hâm mộ và máy chủ và nó không có nhiều tiêu chuẩn được xác định rõ ràng. Bạn có thể gửi và chấp nhận thông tin dưới dạng JSON , XML hoặc thậm chí là văn bản thuần túy. Đó là trọng lượng nhẹ so với SOAP .


-4

Tóm lại, các dịch vụ web dựa trên SOAP, mô hình Dịch vụ dựa trên SOAP xem thế giới là một hệ sinh thái của các đồng đẳng không thể kiểm soát lẫn nhau, nhưng phải hợp tác với nhau bằng cách tôn trọng các hợp đồng được công bố. Đó là một mô hình hợp lệ của thế giới thực lộn xộn và các hợp đồng dựa trên siêu dữ liệu tạo thành Giao diện dịch vụ SOAP.

chúng ta vẫn có thể liên kết SOAP với các cuộc gọi thủ tục từ xa dựa trên XML, nhưng công nghệ dịch vụ web SOAPbided đã nổi lên thành một mô hình nhắn tin linh hoạt và mạnh mẽ.

SOAP giả định tất cả các hệ thống là độc lập và không có hệ thống nào có kiến ​​thức về nội bộ của chức năng khác và nội bộ. Hầu hết các hệ thống như vậy có thể làm là gửi tin nhắn cho nhau và hy vọng chúng sẽ được xử lý. Các hệ thống xuất bản các hợp đồng mà họ cam kết tôn vinh và các hệ thống khác dựa vào các hợp đồng này để trao đổi tin nhắn với họ.

Hợp đồng giữa các hệ thống được gọi chung là siêu dữ liệu và bao gồm các mô tả dịch vụ, các mẫu trao đổi thông điệp được hỗ trợ và các chính sách điều chỉnh chất lượng dịch vụ (một dịch vụ có thể cần được mã hóa, cung cấp đáng tin cậy, v.v.) đặc điểm kỹ thuật của dữ liệu (tài liệu tin nhắn) sẽ được hệ thống gửi và nhận. Các tài liệu được mô tả bằng ngôn ngữ mô tả XML như Định nghĩa lược đồ XML. Miễn là tất cả các hệ thống tôn trọng các hợp đồng được công bố của chúng, chúng có thể hoạt động và các thay đổi đối với các hệ thống bên trong không bao giờ ảnh hưởng đến bất kỳ hệ thống nào khác. Mỗi hệ thống có trách nhiệm dịch các triển khai nội bộ của riêng mình sang và từ các hợp đồng của nó

REST - Chuyển giao nhà nước liên quan. Giao thức vật lý là HTTP. Về cơ bản, REST là tất cả các tài nguyên riêng biệt trên web có thể được nhận dạng duy nhất bởi một URL. Tất cả các hoạt động có thể được thực hiện trên các tài nguyên này có thể được mô tả bằng một nhóm động từ giới hạn (các động từ CRUD Hồi), lần lượt ánh xạ tới các động từ HTTP.

REST's ít nặng hơn nhiều so với SOAP.

Làm việc về dịch vụ web


2
-1 Hầu hết mọi thứ bạn nói đều không chính xác. SOAP không chứa mô tả. WSDL nào. WSDL là một định dạng XML - nó không "chạy" trên bất kỳ giao thức nào. SOAP không yêu cầu phần mềm trung gian. REST không phải là "thế hệ thứ hai của dịch vụ web". WADL không phải là một tiêu chuẩn. Xem en.wikipedia.org/wiki/Web_Application_Descrip_L Language .
John Saunders
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.