Web Services:简单的Java示例
Eijux(讨论 | 贡献)2021年6月4日 (五) 01:19的版本 (建立内容为“category:Web Services == 关于 == 一个完整的Web服务包括以下步骤: # Web服务提供者设计实现Web服务,并将调试正确后的Web服…”的新页面)
关于
一个完整的Web服务包括以下步骤:
- Web服务提供者设计实现Web服务,并将调试正确后的Web服务通过Web服务中介者发布,并在UDDI注册中心注册; (发布)
- Web服务请求者向Web服务中介者请求特定的服务,中介者根据请求查询UDDI注册中心,为请求者寻找满足请求的服务; (发现)
- Web服务中介者向Web服务请求者返回满足条件的Web服务描述信息,该描述信息用WSDL写成,各种支持Web服务的机器都能阅读;(发现)
- 利用从Web服务中介者返回的描述信息生成相应的SOAP消息,发送给Web服务提供者,以实现Web服务的调用;(绑定)
- Web服务提供者按SOAP消息执行相应的Web服务,并将服务结果返回给Web服务请求者。(绑定)
创建服务端/客户端项目,项目可以是 Java Web 项目,也可以是普通的 Java 项目:
服务端
- 通过 javax.jws.WebService 注解提供服务;
- 通过 javax.xml.ws.Endpoint 类的 publish 方法来发布服务,并提供发布的地址以及发布的服务类;
代码:
package com.eijux.wsServer;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
@WebService
public class Function {
// 可以显示指定服务的“operationName”(client中调用)
@WebMethod(operationName="sayHello1")
public String sayHello(String userName)
{
return "Hello,"+userName+"!";
}
@WebMethod(operationName="sayHello2")
public String sayHello(){
return "Hello World!";
}
// 如果不指定“operationName”,则与方法名相同
@WebMethod
public String transWords(String words){
String res = "";
for(char ch : words.toCharArray()){
res += ch+",";
}
return res;
}
public static void main(String[] args) {
// 使用Endpoint(终端)类发布webservice
Endpoint.publish("http://localhost:8089/service/function", new Function());
System.out.println("Publish Success");
}
}
服务发布成功后,访问发布的地址:
点击链接,打开 WSDL 配置:
客户端
通过工具生成客户端代码:
- 命令行工具:
wsimport -d .class文件的输出目录 -s .java文件的输出目录 -p “生成类所在包名” -keep “wsdl发布地址”
- 示例:
wsimport -s D:\Workspaces\JAVA\TheClient\src -p com.eijux.wsClient -keep http://localhost:9095/service/function?wsdl
- Eclipse工具:
代码:
package com.eijux.wsClientTest;
import javax.rmi.RemoteException;
import javax.xml.rpc.ServiceExceptipn;
// 如果 Client 与生成的代码不在同一目录,需要引入对应的包
// 需要引入的包在生成代码中
import com.eijux.wsServer.Function;
import com.eijux.wsServer.FunctionService;
import com.eijux.wsServer.FunctionServiceLocator;
public class TestWs {
public static void main(String[] args){
try{
//Function f = new FunctionService().getFunctionPort();
Function f = new FunctionServiceLocator().getFunctionPort();
System.out.println(f.sayHello1("eijux"));
System.out.println(f.sayHello2(""));
System.out.println(f.getValue("zl"));
}
catch(ServiceExceptipn e){
e.printStackTrace();
}
catch(RemoteException e){
e.printStackTrace();
}
}
}
FAQ
可能的异常:
- 服务端:
runtime modeler error: Wrapper class com.eijux.wsServer.jaxws.GetValue is not found. Have you run APT to generate them?
- JDK 版本过低(低于1.6.0_17):调整该服务端项目所引用的 JDK 版本。
- 生成命令:
directory not found: D:\Workspaces\JAVA\The Client\src
- 路径有空格。
- 生成命令:
[ERROR] failed.noservice=Could not find wsdl:service in the provided WSDL(s):
- 生成命令的“wsdl发布地址”末尾缺少“?wsdl”。