这几天一直在看webService相关的知识。
webService是一个跨平台访问的第三方插件,方便易用,多平台使用。
开发中我们可能自己是服务端,提供webService接口给别人访问我们的系统;也有可能我们调用别人的webService接口去访问别人的系统(比如查询天气预报)。
下面是服务端和客户端的开发,实际开发中我们只是其中一方。
服务端开发:
①创建一个服务类,运行main方法发布即可,服务端就开发完成了。
package com.lijianbo.service; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.xml.ws.Endpoint; /** * WebService * 将 Java 类标记为实现 Web Service,或者将 Java 接口标记为定义 Web Service 接口 * 服务类这一个,写好后运行main方法发布服务即可,服务端就开发完成了。 * */ @WebService(serviceName="MyService",targetNamespace="http://www.hello.com") public class HelloService { @WebMethod(operationName="AliassayHello") @WebResult(name="myReturn") public String sayHello(@WebParam(name="name") String name){ return "服务器,hello: " + name; } public String sayGoodbye(String name){ return "服务器,goodbye: " + name; } @WebMethod(exclude=true)//当前方法不被发布出去 public String sayHello2(String name){ return "hello" + name; } public static void main(String[] args) { /** * 参数1:服务的发布地址 * 参数2:服务的实现者 * Endpoint 会重新启动一个线程 */ Endpoint.publish("http://172.18.100.52:456/hello", new HelloService()); System.out.println("****[ Server ready...WebService发布成功。]"); } }
②访问浏览器,网址为:
http://172.18.100.52:456/hello?wsdl
看到如下结果,那么就说明成功了。
This XML file does not appear to have any style information associated with it. The document tree is shown below. <!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI‘s version is JAX-WS RI 2.2.4-b01. --> <!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI‘s version is JAX-WS RI 2.2.4-b01. --> <definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy"xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.hello.com"xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://www.hello.com" name="MyService"> <types> <xsd:schema> <xsd:import namespace="http://www.hello.com" schemaLocation="http://172.18.100.52:456/hello?xsd=1"/> </xsd:schema> </types> <message name="AliassayHello"> <part name="parameters" element="tns:AliassayHello"/> </message> <message name="AliassayHelloResponse"> <part name="parameters" element="tns:AliassayHelloResponse"/> </message> <message name="sayGoodbye"> <part name="parameters" element="tns:sayGoodbye"/> </message> <message name="sayGoodbyeResponse"> <part name="parameters" element="tns:sayGoodbyeResponse"/> </message> <portType name="HelloService"> <operation name="AliassayHello"> <input wsam:Action="http://www.hello.com/HelloService/AliassayHelloRequest" message="tns:AliassayHello"/> <output wsam:Action="http://www.hello.com/HelloService/AliassayHelloResponse" message="tns:AliassayHelloResponse"/> </operation> <operation name="sayGoodbye"> <input wsam:Action="http://www.hello.com/HelloService/sayGoodbyeRequest" message="tns:sayGoodbye"/> <output wsam:Action="http://www.hello.com/HelloService/sayGoodbyeResponse" message="tns:sayGoodbyeResponse"/> </operation> </portType> <binding name="HelloServicePortBinding" type="tns:HelloService"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> <operation name="AliassayHello"> <soap:operation soapAction=""/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> <operation name="sayGoodbye"> <soap:operation soapAction=""/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> </operation> </binding> <service name="MyService"> <port name="HelloServicePort" binding="tns:HelloServicePortBinding"> <soap:address location="http://172.18.100.52:456/hello"/> </port> </service> </definitions>
客户端开发:
①cmd 进入 命令行。
输入:
wsimport -d c: -keep -verbose http://172.18.100.52:456/hello?wsdl
它有几个很重要的参数,
-d 表示输出的目录,目录必须事先存在,否则导出失败。
-keep表示导出webservice的class文件时是否也导出源代码Java文件。
-verbose表示详细信息。
看我们的导出命令。我们直接导在C盘中。
显示:
C:\>wsimport -d c: -keep -verbose http://172.18.100.52:456/hello?wsdl parsing WSDL... Generating code... com\hello\AliassayHello.java com\hello\AliassayHelloResponse.java com\hello\HelloService.java com\hello\MyService.java com\hello\ObjectFactory.java com\hello\SayGoodbye.java com\hello\SayGoodbyeResponse.java com\hello\package-info.java
这样客户端的代码就生成了。我们是生成在C盘下的,拷贝生成的代码到项目。
②运行测试类,调用webService接口
package com.lijianbo.client; import java.rmi.RemoteException; import javax.xml.rpc.ServiceException; import com.hello.HelloService; import com.hello.MyService; public class TestHello { /** * 通过wsimport 解析wsdl生成客户端代码调用WebService服务 * * 运行测试类就能成功调用服务器的接口,得到返回数据。 * */ public static void main(String[] args) throws ServiceException, RemoteException { /** * <service name="MyService"> * 获得服务名称 */ MyService mywebService = new MyService(); /** * <port name="HelloServicePort" binding="tns:HelloServicePortBinding"> */ HelloService hs = mywebService.getHelloServicePort(); System.out.println("hs:"+hs); /** * 调用方法 */ System.out.println(hs.sayGoodbye("sjk=============")); System.out.println(hs.aliassayHello("sjk================")); } }
运行结果为:
hs:JAX-WS RI 2.2.4-b01: Stub for http://172.18.100.52:456/hello 服务器,goodbye: sjk============= 服务器,hello: sjk================
上面可以看出,这里成功访问到了服务器的接口,返回了数据。说明调用webService成功了。
webService基本的知识点就是这样了,当时实际中服务端代码是发布在服务器的,而不是本机。
客户端代码也可以采用调用生成好的jar包(服务端生成)来使用。
实际开发中,客户端往往还要根据SOAP文档来拼接参数,通过SOAP协议进行参数传递,然后采用客户端代理类来调用接口,得到返回的数据。
时间: 2024-10-12 16:46:17