2011-08-11 44 views
14

Tôi có thể có xà phòng: địa chỉ địa chỉ trong WSDL liên quan đến vị trí WSDL hay ít nhất là liên quan đến máy chủ? Ví dụ tôi muốn viết:Xà phòng WSDL tương đối: địa chỉ địa chỉ

<soap:address location="https://exampleserver.com/axis2/services/ExampleService" /> 

như:

<soap:address location="/axis2/services/ExampleService" /> 

này sẽ cho phép triển khai nhanh hơn để nhiều máy chủ, như máy chủ thử nghiệm. Ngoài ra, trong trường hợp trục2c nếu tôi muốn dịch vụ của mình được sử dụng cả từ HTTP hoặc HTTPS trở nên khó khăn hơn cho các nhà phát triển sử dụng dịch vụ của tôi vì họ không thể đơn giản nhập WSDL từ vị trí mặc định của nó "? WSDL".

+0

_life trở nên khó khăn hơn cho các nhà phát triển sử dụng dịch vụ của tôi vì họ không thể đơn giản nhập wsdl từ vị trí mặc định của nó "? WSDL" _ Tôi không hiểu phần này. Tại sao cuộc sống khó khăn nếu bạn có địa chỉ tuyệt đối trong WSDL thay vì địa chỉ tương đối? –

+0

Vì bạn chỉ có một địa chỉ và họ cần 2 địa chỉ (một cho https và một cho http). – Mihai

+0

Khi tôi sử dụng dịch vụ web, tôi hoàn toàn bỏ qua địa chỉ SOAP và ghi đè lên điều này trong ứng dụng khách của tôi. Khi viết máy chủ, chỉ cần viết một cái gì đó ngẫu nhiên nhưng hợp lệ. –

Trả lời

7

WSDL mô tả cho khách hàng các định dạng tin nhắn, loại, thông số, vv cần thiết để tương tác với dịch vụ web. Điều này sau đó được sử dụng bởi các công cụ như WSDL2C để tạo mã cần thiết cho tương tác.

Nhưng ngay cả khi bạn tiếp xúc với dịch vụ của mình trên HTTP hoặc HTTPS, mã của khách hàng sẽ giống nhau. Bạn không tạo lại sơ khai khách hàng của mình cho mỗi địa chỉ điểm cuối. Khách hàng vẫn giữ nguyên, đó là điểm truy cập thay đổi.

Địa chỉ này không được mã hóa cứng trong mã khách hàng được tạo, nó phải là URL có thể định cấu hình bên trong ứng dụng khách.

Chắc chắn, bạn có một URL được chỉ định bên trong WSDL và đó là một phiền toái khi bạn triển khai dịch vụ web của bạn trong máy chủ dev, sau đó dàn dựng và tiếp theo vào sản xuất. Điểm cuối sẽ khác nhau trong mỗi môi trường (có thể nhân với 2 cho HTTP + HTTPS) nhưng tại thời điểm này, nhà phát triển của bạn không bị ảnh hưởng bởi vì bạn không tạo lại mã.

Khi truy cập dịch vụ web, bạn sẽ vẫn có các địa chỉ khác nhau (dành cho máy chủ dev, dàn dựng và máy chủ) ngay cả khi nó có liên quan đến thứ gì đó hoặc tuyệt đối. Vì vậy, tôi không thấy cách hữu ích khi có địa chỉ tương đối bên trong WSDL vì bạn vẫn phải quản lý các điểm truy cập vào cấu hình máy khách.

+2

Trong PHP, cách đơn giản để truy cập dịch vụ web là cung cấp vị trí WSDL trong hàm tạo SoapClient. Địa chỉ dịch vụ được lấy từ wsdl. Nếu không chính xác trong wsdl, trình khách dịch vụ sẽ phải chỉ định đúng một trình điều khiển bằng tay. Bạn chắc chắn có một không chính xác nếu bạn sử dụng dịch vụ cả trên http và https, trừ khi bạn thay đổi địa chỉ từ wsdl động. – Mihai

3

Sau một tìm kiếm dài, tôi gần như chắc chắn rằng thuộc tính location của soap:address phải là một URL tuyệt đối. Điều này khiến mọi thứ trở nên phức tạp hơn nếu bạn làm việc với các môi trường khác nhau, chẳng hạn như phát triển, thử nghiệm và sản xuất.

Có thể giải pháp khác là đọc phần phía đầu của URL từ tệp cấu hình (ví dụ: https://exampleserver.com) và phần cuối cùng từ WSDL (ví dụ: /axis2/services/ExampleService) và kết hợp chúng để tạo đường dẫn tuyệt đối . Trước đây sẽ cho phép bạn chuyển đổi giữa các môi trường.

+0

Đây là những gì tôi đang tìm kiếm. Nhưng tôi dường như không thể làm được. – elcool

4

Có hai cách để nhận WSDL.

Một nơi một wsdl mã hóa cứng được phục vụ, ví dụ:

https://hostname/contextname/services/myAPIService/myAPI.wsdl 

và một số khác, nơi một wsdl tạo được phục vụ, ví dụ:

https://hostname/contextname/services/myAPIService?wsdl 

Nếu bạn sử dụng tùy chọn động nó sẽ sử dụng mã này:

req.getRequestURL().toString(); 

để nhận URL sẽ được sử dụng trong WSDL được tạo. Mã này nằm trong lớp ListingAgent (trong gói org.apache.axis2.transport.http).

Từ những gì bạn đã đề cập trong câu hỏi nếu bạn muốn có vị trí tương đối, bạn phải sử dụng nó ở nhiều máy chủ, vì vậy bạn cần sử dụng tùy chọn động. Một vấn đề tôi tìm thấy với các tùy chọn động là nếu trong WSDL ban đầu, vị trí đang sử dụng HTTP, sau đó trong WSDL, nó sẽ vẫn sử dụng HTTP ngay cả khi bạn đã sử dụng HTTPS để truy cập nó. (Điều này xảy ra trong phiên bản 1.5 là dự án của tôi đang sử dụng)

Một vấn đề khác là nếu bạn đang sử dụng bộ cân bằng tải, vì WSDL được tạo sẽ được tạo với vị trí của máy chủ cuối thay vì cân bằng. Một tùy chọn cho điều này sẽ là mở rộng các lớp AxisServlet và ListingAgent để thay thế mã được đề cập ở trên.

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