2008-11-17 39 views
7

Tôi đang triển khai dịch vụ web cho ứng dụng PHP và đang cố gắng hiểu cả dịch vụ web chuẩn và dịch vụ web RESTful nào phải cung cấp. Mục đích của tôi là viết mã bao bọc để trừu tượng hóa các chi tiết dịch vụ web để các nhà phát triển chỉ có thể "khởi tạo các đối tượng từ xa" và sử dụng chúng. Dưới đây là suy nghĩ của tôi, có lẽ một số bạn có thể thêm kinh nghiệm của bạn và mở rộng này:Dịch vụ web RESTful và SOAP khác nhau như thế nào trong thực tế?

RESTful Web servcies

về cơ bản chỉ là "XML feeds theo yêu cầu", vì vậy ví dụ bạn có thể viết mã wrapper cho một ứng dụng client để nó có thể truy vấn các ứng dụng máy chủ theo cách này:

$users = Users::getUsers("state = 'CO'"); 
  • này sẽ lần lượt nhận được một nguồn cấp dữ liệu XML thành một URL từ xa
  • $ người dùng có thể được thực hiện vào một bộ sưu tập đầy đủ đối tượng người dùng, hoặc
  • trái như XML, hoặc
  • biến thành một mảng vv
  • kịch bản truy vấn ("state = 'CO'") sẽ được dịch sang SQL trên phía máy chủ
  • Dịch vụ web RESTful nói chung chỉ đọc từ chế độ xem của ứng dụng khách, mặc dù bạn có thể viết mã có thể sử dụng POST hoặc GET để thực hiện thay đổi trên máy chủ, ví dụ: chuyển mã thông báo được mã hóa để bảo mật, ví dụ:

    $ users = Người dùng :: addUser ($ encryptedTrustToken, 'jim', $ encryptedPassword, 'James', 'Taylor');

và điều này sẽ tạo người dùng mới trên ứng dụng máy chủ.

Chuẩn Web Services

Chuẩn Web servcies cuối cùng về cơ bản làm điều tương tự. Một lợi thế mà họ có là khách hàng có thể khám phá chi tiết của họ thông qua WSDL. Nhưng ngoài ra, nếu tôi muốn viết mã trình bao bọc cho phép nhà phát triển khởi tạo, chỉnh sửa và lưu các đối tượng từ xa, tôi vẫn cần triển khai mã trình bao bọc. SOAP không làm được điều đó đối với tôi, nó có thể làm điều này:

$soap = new nusoap_client('http://localhost/test/webservice_user.php?wsdl', true); 
$user = $soap->getProxy(); 
$lastName = $user->lastName(); 

nhưng nếu tôi muốn chỉnh sửa và tiết kiệm:

$user->setLastName('Jones'); 
$user->save(); 

sau đó tôi cần phải ví dụ xử lý tất cả các trạng thái ở phía máy chủ, SOAP dường như không giữ đối tượng đó ở phía máy chủ cho mỗi máy khách.

Có lẽ có những hạn chế trong triển khai SOAP PHP tôi đang sử dụng (nusoap). Có lẽ triển khai Java và .NET làm được nhiều hơn thế.

Sẽ thích nghe phản hồi của bạn để làm sáng tỏ một số trong những đám mây này.

+0

Tôi không nhận được câu hỏi. Bạn không thể làm gì? Bạn gặp vấn đề gì? –

Trả lời

8

Họ là những mô hình khác nhau ... Văn là dữ liệu trung tâm, nơi-như SOAP là hoạt động trung tâm. tức là với SOAP, bạn có xu hướng có các hoạt động rời rạc "SubmitOrder", v.v. nhưng với REST bạn thường có nhiều chất lỏng hơn về cách bạn đang truy vấn dữ liệu.

SOAP cũng có xu hướng liên quan đến độ phức tạp hơn nhiều (đôi khi cần thiết) - REST quay lại POX v.v. và YAGNI.


Xét về .NET, các công cụ như "wsdl.exe" sẽ cung cấp cho bạn một thư viện client-side ủy quyền đầy đủ để đại diện cho một dịch vụ SOAP (hoặc "svcutil.exe" cho một dịch vụ WCF):

var someResult = proxy.SubmitOrder(...); 

Đối với REST có .NET, tôi đoán ADO.NET Dịch vụ dữ liệu là trình phát rõ ràng nhất. Ở đây, công cụ (datasvcutil.exe) sẽ cung cấp cho bạn một bối cảnh dữ liệu phía máy khách đầy đủ với sự hỗ trợ LINQ. LINQ là cách tương đối mới của .NET để tạo các truy vấn phức tạp. Vì vậy, một cái gì đó tương tự (với kiểm tra kiểu mạnh/tĩnh và IntelliSense):

var qry = from user in ctx.Users 
      where user.State == 'CO' 
      select user; 

(điều này sẽ được dịch sang/từ cú pháp REST của phù hợp với ADO.NET Data Services)

0

Sự khác biệt chính là cơ bản cụ .

Nhiều ngăn xếp SOAP cao cấp che phủ phần lớn cơ sở hạ tầng SOAP từ nhà phát triển, đến nơi bạn đang làm việc khá nhiều chỉ với DTO/Documents và RPC.

REST qua HTTP đặt thêm gánh nặng đó cho bạn nhà phát triển (định dạng thương lượng [XML, JSON, HTTP POST], phân tích kết quả [DOM, bản đồ, DTO marshalling, v.v.)).

Rõ ràng, bạn có thể viết một lớp logic để làm việc với chi tiết này dễ dàng hơn. Và một số khung công tác REST đã đến để làm cho điều này dễ dàng hơn, nhưng hiện tại, nó vẫn là một nhiệm vụ trong danh sách TODO của bạn khi bạn muốn sử dụng hoặc tiêu thụ các dịch vụ đó.

0

Phản hồi của tôi là nếu bạn muốn trạng thái ở xa, bạn không nói về dịch vụ web. Tôi không biết về bất kỳ mô hình hiện đại nào đối phó với tình trạng từ xa. Tôi nghĩ rằng nếu bạn cần nhà nước từ xa bạn đang ở trên của riêng bạn (không tôn giáo để làm theo). Chỉ cần ném xml từ đây đến đó và không nhớ lý thuyết.

Tôi phải thêm trạng thái từ xa đó là điều xấu. Tránh nó nếu bạn có thể.

1

Xà phòng chỉ là một tập hợp các lược đồ XML đã thỏa thuận được ban phước bởi một nhóm tiêu chuẩn. Đó là sức mạnh là nó được thiết kế cho khả năng tương tác và nó hỗ trợ nhiều tính năng cấp doanh nghiệp. Xà phòng trên bất kỳ nền tảng nào sẽ không cung cấp các hoạt động bạn đang tìm kiếm. Bạn cần thiết kế & triển khai hợp đồng dịch vụ để nhận các tính năng đó.

Có vẻ như bạn muốn các đối tượng ở xa không có Xà phòng hoặc REST đặc biệt tốt. Có lẽ bạn sẽ tốt hơn khi nhìn vào XML-RPC.

2

Tôi đang lặp lại những gì Marc Gravell đã đề cập. Khi mọi người hỏi tôi về REST (và họ thường có ý tưởng về SOAP và SOA), tôi sẽ nói với họ REST = ROA vì nó là tài nguyên/định hướng dữ liệu, đó là một mô hình khác và do đó có mối quan tâm thiết kế khác nhau. Trong trường hợp của bạn, nếu tôi đọc chính xác, bạn muốn tránh viết mã trình bao bọc và cần một giải pháp có thể lưu trữ các đối tượng và các thuộc tính của chúng từ xa (và ẩn chúng hoàn toàn khỏi các nhà phát triển). Tôi thực sự không thể đề xuất một giải pháp tốt hơn ..Umm, cho tôi biết nếu một trong những bao giờ đến gần để đáp ứng yêu cầu của bạn:

  1. EJB3/JPA
  2. CouchDB (REST/JSON)

Hãy cho tôi biết quá nếu tôi đã giải thích câu hỏi của bạn sai.

Nếu chúng ta so sánh XML-RPC và SOAP, cái sau sẽ cho bạn xử lý loại dữ liệu tốt hơn, trước đây bạn sẽ xử lý các kiểu dữ liệu đơn giản hơn, nhưng bạn sẽ phải viết một lớp hoặc bộ điều hợp để chuyển đổi chúng đối tượng miền.

yc

Các vấn đề liên quan