2009-12-17 12 views
11

Vì vậy, tôi là một chút mới đối với dịch vụ web và một tình huống gần đây đã xuất hiện nơi chúng tôi đã thêm phần tử vào loại dữ liệu được trả lại cho khách hàng. Các khách hàng phàn nàn rằng điều này đã phá vỡ việc thực hiện của họ bởi vì nó nghẹn ngào về yếu tố mới mà nó không mong đợi. (chúng tôi đang cung cấp các dịch vụ qua Axis2).Khả năng tương thích ngược và Dịch vụ Web

Với tôi, điều này có vẻ như một thay đổi vô hại mà khách hàng có thể xử lý một cách duyên dáng (tôi đã làm việc với một số khung công tác phi dịch vụ web, nơi thêm thông tin tùy chọn hoàn toàn có thể chấp nhận được). Tôi có thể hiểu nếu chúng tôi đã xóa hoặc đổi tên một số trường có thể gây ra sự cố cho khách hàng.

Về cơ bản, tôi mong đợi wsdl hoạt động như một giao diện. Nếu chúng ta thực hiện một sự thay đổi về cơ bản các kiểu con của giao diện đó, tôi sẽ mong đợi khách hàng vui vẻ bỏ qua các phần tử không liên quan. Đây có phải chỉ là một dịch vụ web ngắn hay có cách tạo thay đổi thụ động cho các dịch vụ để khách hàng mới có thể nhận được dữ liệu bổ sung trong khi khách hàng cũ có thể cập nhật khi rảnh rỗi?

+0

Tôi cho rằng khách hàng có thể giả mạo nó và không sử dụng giao diện SOAP và có thể phân tích phản hồi bằng một số phân tích cú pháp thủ công/biểu thức chính quy (thật ngạc nhiên khi có bao nhiêu người làm điều đó). Tôi nói điều này vì tôi thường xuyên tạo các giao diện SOAP của máy khách và máy chủ trong C#, PHP, Perl và JavaScript trên các hệ thống Unix & Windows (dành cho các ứng dụng web, phía máy chủ và ứng dụng máy khách) và chưa bao giờ gặp phải vấn đề này. trong yêu cầu hoặc phản hồi chưa từng gây ra vấn đề). Tôi sẽ hỏi họ những khách hàng SOAP mà họ đang sử dụng. :-) –

Trả lời

9

WSDL thực sự hoạt động như một hợp đồng nhiều hơn một giao diện. WSDL mô tả chính xác những gì hoạt động dự kiến ​​sẽ "nhận" và những gì nó dự kiến ​​sẽ "trở lại". Sự tương tự gần nhất với điều này sẽ là trong C thay đổi nguyên mẫu cho một hàm mà không thay đổi chính hàm đó, chúng sẽ không khớp và gây ra vấn đề.

WSDL cụ thể hơn là hành vi bạn đang "đảm bảo" càng tốt.

Nếu bạn cần sự linh hoạt trong dữ liệu trả về của bạn (ví dụ: thêm/gỡ bỏ các lĩnh vực vv), bạn có thể làm một trong các cách sau: định nghĩa WSDL của bạn

  1. Phiên bản và công bố dịch vụ có thể chuyển hướng các phiên bản cũ với các phiên bản mới hơn
  2. Sử dụng nhiều loại dữ liệu trừu tượng hơn, chẳng hạn như XML để ẩn sự phức tạp hoặc thay đổi dữ liệu.

2 có nhiều rủi ro hơn, nhưng có thể được quản lý bằng XSD hoặc các công nghệ khác. Yêu cầu dự án cụ thể của bạn sẽ quyết định những gì có thể chấp nhận được.

4

Trong quá khứ, khi xử lý các API WebService được tiếp xúc, tôi đã luôn đi với triết lý phiên bản ngày. Thật không may, bạn phải đối phó với khả năng tương thích ngược đối với bất kỳ API nào bạn phát hành ra công chúng khi bạn đã ra khỏi chế độ "beta" (và đôi khi thậm chí sau đó).

Điều chúng tôi đã làm thật sự đơn giản; vào ngày API mới được phát hành, chúng tôi muốn tạo ra một cấu trúc thư mục như sau:

http://mydomain.com/path/to/service/2009/12/17/servicename.svc 

Bằng cách đó chúng ta sẽ biết được phiên bản mới nhất là chỉ bằng cách kiểm tra cấu trúc thư mục, và các khách hàng của chúng tôi sẽ không có lo lắng về việc phá vỡ các thay đổi cho đến khi chúng sẵn sàng nâng cấp. Làm việc như một nhà vô địch cho chúng tôi; điều duy nhất tôi có thể đã thay đổi là sử dụng một thư mục duy nhất để họ dễ dàng xem tất cả hơn:

http://mydomain.com/path/to/service/2009-12-17/servicename.svc 
+0

Tôi làm điều gì đó rất giống với điều này, ngoại trừ tôi thích sử dụng các số phiên bản rõ ràng hơn (ví dụ: http: // http: //example.com/ServiceName/1.0/Service/) và CHỈ CHỈ việc nếu API thay đổi một cách tương thích ngược. –

3

WSDL là giao diện SOAP được xuất bản hiệu quả của dịch vụ web của bạn. Nhiều khách hàng sử dụng điều này để tạo các proxy khách hàng của họ để lộ tất cả các phương thức webservice của bạn bằng ngôn ngữ lập trình mà họ lựa chọn. Hầu hết các khách hàng được tạo mã này rất mong manh và sẽ chọn ném một ngoại lệ nếu họ thấy một phần tử mà họ không nhận ra (nghĩa là nó không có trong WSDL) thay vì bỏ qua nó. Một số thì thoải mái hơn và nó thực sự phụ thuộc vào công nghệ của khách hàng mà họ sử dụng, tức làDataContract mới của Microsoft có giao diện IExtensibleData trên máy khách của họ để lưu giữ dữ liệu cụ thể mà họ không nhận ra, vì vậy họ sẽ bỏ qua phần lớn các yếu tố không rõ.

Các proxy khách hàng tạo mã và SOAP tự vay với các loại vấn đề này vì chúng tạo ra các khách hàng muốn hiểu 'toàn bộ lược đồ' thay vì chỉ các bit mà họ quan tâm. Trình phân tích cú pháp và chỉ cần rút ra các bit mà họ cần.

Nếu dịch vụ web của bạn đang được phát triển hoặc thay đổi liên tục thì SOAP thực sự không phải là lựa chọn tốt nhất của bạn vì nó sẽ có nghĩa là mọi thay đổi họ sẽ phải tạo lại, xây dựng lại và triển khai lại dịch vụ khách hàng của họ. Tùy thuộc vào tình huống của bạn, bạn có thể xem xét việc cung cấp các dịch vụ web REST + POX (Plain Old Xml) thay vì đơn giản hơn để phân tích vì nó không có chi phí SOAP, có thể được gọi thông qua một URL bình thường và không có thư viện SOAPClient (ví dụ: trực tiếp trong trình duyệt, sử dụng AJAX)

+0

Tôi không đồng ý với những điều trên vì tôi chưa bao giờ gặp vấn đề với các yếu tố bổ sung trong yêu cầu/phản hồi bằng cách sử dụng các thư viện SOAPClient, C# (Mono/.NET) hoặc Perl SOAP của PHP hoặc bằng JavaScript (tôi sẽ lưu ý rằng có ít nhất một phần tử) trình duyệt chéo tốt SOAP khách hàng trong JavaScript). Các tùy chọn REST cho các giao diện công khai là các công cụ có giá trị cho những thứ như mashup nhưng SOAP là một cách tiếp cận có lập trình tốt hơn cho các dịch vụ web. –

+1

Nếu bạn sử dụng máy khách SOAP thì bạn không sử dụng mã được tạo bởi WSDL, tất cả việc bạn đang làm là sử dụng trình phân tích cú pháp Xml thông minh để bỏ qua các tiêu đề SOAP để tải trọng (tất nhiên bạn sẽ không nhận được trình phân tích cú pháp lỗi với ngôn ngữ động). Nếu đây là trường hợp thì chính xác lợi ích nào là chi phí cao hơn và độ phức tạp của dịch vụ web SOAP? – mythz

+0

Tiền đề của bạn không hợp lệ vì khách hàng SOAP sử dụng mã được tạo bởi WSDL, họ không có xu hướng ném lỗi khi có các phần tử không liên quan. Họ gần như tất cả các công việc như thế này trong thực tế. Điều này không bao giờ phủ nhận lợi thế của việc sử dụng SOAP vì đĩa nồi hơi * nên * tất cả được tự động hóa. Như vậy, tôi sẽ truy cập là rất dễ thực hiện (trừ khi bạn sử dụng một cái gì đó khủng khiếp và không được chấp nhận như định dạng RPC/Mã hóa, đó là những gì mang lại cho SOAP một danh tiếng xấu cho sự phức tạp). –

0

Một câu trả lời có thể là sử dụng các nhóm thay thế để bật mô hình trừu tượng trong XSD bạn nhập. Khả năng xử lý một nhóm thay thế như vậy vẫn phải được xác thực với các khung công tác mà bạn đang sử dụng để gọi các dịch vụ đó.