2008-11-15 30 views
35

Tôi có một dịch vụ web SOAP rất đơn giản mà tôi cần để tiêu thụ từ một máy khách Java. Cách dễ nhất để thực hiện điều này mà không cần sử dụng bất kỳ thư viện của bên thứ ba nào? Yêu cầu là máy chủ và cổng được đọc từ web.xml trước mỗi cuộc gọi đến ws.Đơn giản chỉ cần tiêu thụ một dịch vụ web trong Java

Trả lời

1

Nếu không sử dụng bất kỳ thư viện của bên thứ ba nào? Làm quen với tiêu chuẩn SOAP thực sự tốt và học cách yêu SAX.

Nếu bạn không thể yêu SAX, hãy thay thế yêu cầu không có bên thứ ba của bạn và sử dụng StAX (với woodstox) để thay thế.

Cách tiếp cận này có thể là "dễ nhất" (xem xét yêu cầu không phải của bên thứ ba) nhưng tôi không nghĩ rằng nó sẽ là dễ dàng.

+0

Tôi không hiểu tại sao nó lại khó như vậy? Chắc chắn tất cả những gì bạn phải làm là xây dựng yêu cầu bằng cách sử dụng một bộ xâu chuỗi, mở một kết nối rồi đặt yêu cầu xuống kết nối và chờ phản hồi. Hay tôi đang thiếu thứ gì đó ở đây? – Deano

+5

Những gì bạn có thể bị thiếu là khó khăn/tedium của việc xây dựng yêu cầu bằng cách sử dụng StringBuffer. Nó chắc chắn có thể, nhưng tôi sẽ không khuyên bạn nên nó. Điều tương tự cũng xảy ra khi đọc phản hồi không có thư viện SOAP. –

8

Nếu bạn có thể thư giãn yêu cầu "không có thư viện của bên thứ ba" và bạn có WSDL cho dịch vụ web thì Axis sẽ thực sự dễ dàng. Chỉ cần biên dịch WSDL bằng cách sử dụng wsdl2java và bạn có thể sử dụng các lớp Java được tạo ra để tiêu thụ dịch vụ web.

22

Tùy thuộc vào phiên bản JAVA bạn đang sử dụng, một số JAX-WS được tích hợp vào nó. JDK 6 có thực thi chuẩn JAX-WS của Java và bạn có thể sử dụng nó.

Xem sau:

+0

JAX-WS trông rất dễ sử dụng, nhưng làm thế nào nó có thể được sử dụng để đọc tên máy chủ từ tệp web.config? – Deano

24

tôi có thể giới thiệu cho bạn thư viện CXF. Sử dụng nó, bạn sẽ có nhiều lựa chọn để gọi dịch vụ web:

  1. Sử dụng dynamic proxy để gọi (không cần phải thực hiện khai Java sử dụng WSDL2Java).

    DynamicClientFactory dcf = DynamicClientFactory.newInstance(); 
    Client client = dcf.createClient("http://admin:[email protected]:8080"+ 
               "/services/MyService?wsdl"); 
    Object[] a = client.invoke("test", ""); 
    System.out.println(a); 
    
  2. Sử dụng cuống Java được tạo từ WSDL, sử dụng wsdl2java.

  3. Nếu máy chủ của bạn được tạo bằng CXF bạn có thể sử dụng lại mã giao diện của bạn trực tiếp (thay vì sử dụng WSDL2Java trên WSDL được tạo ra từ giao diện của bạn!)

Đối với cả hai thứ 2 và thứ 3, đoạn mã sau minh họa cho việc sử dụng CXF:

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); 
factory.setAddress("http://admin:[email protected]:8080/services/MyService"); 
factory.setServiceClass(ITest.class); 
ITest client = (ITest) factory.create(); 
client.test(); 
+0

DynamicClientFactory có yêu cầu bạn tạo sơ khai trước không? – vikasde

+2

Không, bạn có thể thực thi động các phương thức từ tệp wsdl, tham số truyền, nhận kết quả (đối tượng vô hướng hoặc xml). – FoxyBOA

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