加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

WebService几种实现方式

发布时间:2020-12-16 23:29:36 所属栏目:安全 来源:网络整理
导读:WebService使得运行在不同机器上的应用无需借助附加的、专门的第三方软件即可进行数据交换或集成,由于其与平台、编程语言、协议的无关性,它是目前应用程序间最常用的一种通讯方式,要学习WebService,首先要了解与其相关的几种关键技术和规则。 在构建和使

WebService使得运行在不同机器上的应用无需借助附加的、专门的第三方软件即可进行数据交换或集成,由于其与平台、编程语言、协议的无关性,它是目前应用程序间最常用的一种通讯方式,要学习WebService,首先要了解与其相关的几种关键技术和规则。

在构建和使用Web Service时,主要用到以下几个关键的技术和规则:

(1).XML:描述数据的标准方法

(2).SOAP:表示信息交换的协议.

(3).WSDL:Web服务描述语言.

(4).UDDI:通用描述、发现与集成,它是一种独立于平台的,基于XML语言的用于在互联网上描述商务的协议。

XML

可扩展的标记语言(XML)是Web service平台中表示数据的基本格式。除了易于建立和易于分析外,XML主要的优点在于它既是平台无关的,又是厂商无关的。无关性是比技术优越性更重要的:软件厂商是不会选择一个由竞争对手所发明的技术的。

SOAP

SOAP是web service的标准通信协议,SOAP为simple object access protocol的缩写,简单对象访问协议.它是一种标准化的传输消息的XML消息格式

WSDL

WSDL的全称是web service Description Language,是一种基于XML格式的关于web服务的描述语言。其主要目的在于web service的提供者将自己的web服务的所有相关内容,如所提供的服务的传输方式,服务方法接口,接口参数,服务路径等,生成相应的完全文档,发布给使用者。使用者可以通过这个WSDL文档,创建相应的SOAP请求消息,通过HTTP传递给webservice提供者;web服务在完成服务请求后,将SOAP返回消息传回请求者,服务请求者再根据WSDL文档将SOAP返回消息解析成自己能够理解的内容。

UDDI

将web service进行UDDI注册发布,UDDI是一种创建注册表服务的规范,以便大家将自己的web service进行注册发布供使用者查找.然而当服务提供者想将自己的web service向全世界公布,以便外部找到其服务时,那么服务提供者可以将自己的web service注册到相应的UDDI商用注册网站,目前全球有IBM等4家UDDI商用注册网站。因为WSDL文件中已经给定了web service的地址URI,外部可以直接通过WSDL提供的URI进行相应的web service调用。所以UDDI并不是一个必需的web service组件,服务方完全可以不进行UDDI的注册。

?

目前比较流行的webservice的实现方式大致有四种,包括JWS、axis2、XFire和CXF。本文主要介绍前两种方法。

1、JWS是jdk1.6之后新增的对webservice的支持,下面通过一个简单的例子学习通过JWS实现webservice服务器端和客户端的过程。

(1)定义接口,并将接口发布成webservice

package com.web.service;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import com.model.User;

@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface IMyService {
	
	@WebResult(name="Result")
	public int add(@WebParam(name="a")int a,@WebParam(name="b")int b);
	
	@WebResult(name="User")
	public User login(@WebParam(name="username")String username,@WebParam(name="password")String password);
}

?

(2)实现该接口

package com.web.service;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import com.model.User;

@WebService(endpointInterface="com.web.service.IMyService")
public class MyServiceImpl implements IMyService {

	@Override
	public int add(int a,int b) {
		System.out.println(a + "+" + b + "=" + (a + b));
		return a+b;
	}

	@Override
	public User login(@WebParam(name = "username") String username,@WebParam(name = "password") String password) {
		System.out.println(username + " is logging");
		User user = new User();
		user.setId("1");
		user.setUsername(username);
		user.setPassword(password);
		return user;
	}
}


(3)发布服务

package com.web.service;
import javax.xml.ws.Endpoint;
public class MyServer {
	
	public static void main(String[] args){
		String address = "http://localhost:8888/ns";
		Endpoint.publish(address,new MyServiceImpl());
	}
}


(4)客户端测试

package com.web.service;
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;

public class TestClient {

	public static void main(String[] args){
		 try {
			 //创建访问WSDL服务地址的URL
			URL url = new URL("http://localhost:8888/ns?wsdl");
			 //通过QName指明服务的和具体信息
			 QName sname= new QName("http://service.web.com/","MyServiceImplService");
			 //创建服务
			 Service service = Service.create(url,sname);
			 //实现接口
			 IMyService ms =service.getPort(IMyService.class);
			 System.out.println(ms.add(10,25));
			 IMyService ms1 = service.getPort(IMyService.class) ;
			 ms1.login("xiaoli","12345");
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}
}

从上面的例子中可以看到,系统间进行webservice调用时,需要知道对方的接口和实现类。但在实际中,调用方往往不知道对方的接口和实现类。这时,可以通过jdk的导出功能来解决,将wsdl中的接口描述来生成这个接口以及实现类,然后将生成的接口和实现类应用在我们自己的java程序中就可以了,具体的生成命令是: Wsimport -d E:/我的工程/java项目/webservice/? -keep -verbose?http://localhost:8888/ns?wsdl?。

?

2、JWS是轻量级的实现,使用较方便,如果确定是Java语言所编写的应用程序之间的调用,JWS是最佳选择。与JWS相比,axis2则是一种重量级的框架,不过其功能也更强大,它不仅能完成Java语言环境中webservice客户端和服务端,还可以生成其他语言中的webservice客户端和服务端,下面一起来学习一下通过axis2发布webservice。

(1) 首先需要下载axis2.war包,将其放在tomcat的webapp目录下。启动tomcat,访问http://localhost:8080/axis2/,显示如下界面则说明发布成功:

?

(2)编写实现具体功能的Java类,主要类不要放在包中,放在src下

public class MyService {
    public String sayHello(String name,boolean isMan) {
        if(isMan) {
            return "Hello,Mr "+name+"! Welcome to Webservice";
        } else {
            return "Hello,Miss "+name+"! Welcome to Webservice";
        }
    }
}

(3)将我们写好的class类放在tomcat%webappsaxis2WEB-INFpojo文件夹下(如果没有该文件夹请新建一个并以pojo命名)。做完这一步之后启动tomcat,访问http://localhost:8080/axis2/services/listServices,如果出现如下界面则说明发布成功:

(4)发布好之后,我们就可以编写客户端代码调用,客户端代码如下
package com.unimas.datacollection.webservices.client;

import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
import javax.xml.namespace.QName;

public class Client {

	public static void main(String[] args) throws Exception {
		// 使用RPC方式调用WebService
		RPCServiceClient serviceClient = new RPCServiceClient();
		Options options = serviceClient.getOptions();
		// 指定调用WebService的URL
		EndpointReference er = new EndpointReference(
				"http://localhost:8080/axis2/services/MyService");
		options.setTo(er);

		// 指定sayHello方法的参数值
		Object[] opAddArgs = new Object[] { "张三",false };

		// 指定sayHello方法返回值的数据类型的class对象
		Class[] classs = new Class[] { String.class };

		// 指定要调用的sayHello方法及wsdl文件的命名空间,第一个参数表示WSDL文件的命名空间
		// 通过访问http://localhost:8080/axis2/services/MyService?wsdl 就可以看见
		// 元素的targetNamespace属性值
		QName qname = new QName("http://ws.apache.org/axis2","sayHello");

		// 调用sayHello方法并输出该方法的返回值
		// 这里有三个参数的意思:1.是QName对象,表示要调用的方法名;2.webservice的参数值,参数类型是Object[];3.返回值class对象,参数类型是Class[]
		System.out.println(serviceClient.invokeBlocking(qname,opAddArgs,classs)[0]);

	}
}
通过执行客户代码,即可在控制台中输出结果,这就是通过axis2实现webservice的整个过程。两种方法进行比较,可以发现第一种实现功能较灵活 ,第二种比较简单,我们只需开发一个Java类,然后放在相应文件夹下即可。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读