Web Service有关概念及简单例程
Web Service定义了一套标准的调用过程:
WSDL的目的是告诉外界自己能提供什么样的服务,有点类似于java的接口。
WSDLd的全称是Web Service Description Language,是一种基于XML的关于Web服务的描述,主要目的在于将自己的Web服务的所有相关内容如提供服务的传输方式,服务方法接口,接口参数,服务路径等,生成相应的完全的文档,发布给使用者。使用者可以通过这个WSDL文档,创建相应的SOAP请求消息,通过HTTP传递给Web服务提供者;Web服务提供者在完成请求服务后,将SOAP返回消息传回给请求者,服务请求者再根据WSDL文档将SOAP返回消息解析成程序能够理解的内容。
SOAP:标准的传输协议
SOAP是标准化的消息协议,是客户端送给服务器希望调用的类和方法的一种消息格式,也包括服务返回的消息格式。之所以有SOAP是因为只有大家都遵守一套消息格式的标准,相互之间才能明白对方想要干什么。
SOAP是Web Service的标准传输协议,是Simple Object Application Propotol的简写,是一种标准化的传输消息的XML格式。
SOAP请求消息将客户端的服务请求消息发给服务器,比如想调用什么接口,以及接口的参数值等。SOAP答复消息是从服务器返回给客户端的消息,如接口实现类调用后的返回值或是调用服务时的错误信息等。定义WSDL是很重要的,一旦WSDL定义好了,再根据WSDL的输入变量和输出变量的结构就可以知道SOAP的请求消息和响应消息的格式了。
UDDI:服务的公共网址
UDDI是Universal Description Discovery and Intergretion的缩写,是一种创建注册服务的规范,以便大家将自己的Web Service进行注册发布供使用者查找。
当服务提供者想将自己的Web Service发布,以便外部能找到其服务时,那么服务提供这可以将自己的Web Service注册到相应的UDDI商用注册网站。
UDDI并非一个必须的Web Service组件,服务方完全可以不进行UDDI的注册。因为WSDL文件中已经给出了Web Service的地址URI,外部可以通过它进行相应的Web Service调用。
以下是一个Web Service示例程序,主要参考了梁爱虎的《SOA 思想,技术与系统集成应用详解》中的例子:
发布Web服务的类接口:
发布web服务的类:
Web.xml:
wsdd文件server-config.wsdd
测试类:
输出示例:
例程下载(使用Axis,注意Tomcat的lib目录中要包括mail.jar和activation.jar):
http://www.blogjava.net/Files/heyang/SerialNumber20090929130453.rar
使用说明:
使用Ant脚本将jar包打好,再部署到Tomcat中,可以用http://localhost:8080/SerialNumber/services来测试一下是否有输出,有则表示部署成功,之后执行WebServiceClientTest。
主要参考资料:
梁爱虎著《SOA 思想,技术与系统集成应用详解》
- 服务器端首先用一套标准的方法向外界描述它所提供的服务的内容,这属于WSDL的范畴。
- 客户端需要以一种标准的协议来调用此服务,这属于SOAP的范畴。
- 服务提供者将服务内容放在一个公共的网址上让人查询,这属于UDDI的范畴。
WSDL的目的是告诉外界自己能提供什么样的服务,有点类似于java的接口。
WSDLd的全称是Web Service Description Language,是一种基于XML的关于Web服务的描述,主要目的在于将自己的Web服务的所有相关内容如提供服务的传输方式,服务方法接口,接口参数,服务路径等,生成相应的完全的文档,发布给使用者。使用者可以通过这个WSDL文档,创建相应的SOAP请求消息,通过HTTP传递给Web服务提供者;Web服务提供者在完成请求服务后,将SOAP返回消息传回给请求者,服务请求者再根据WSDL文档将SOAP返回消息解析成程序能够理解的内容。
SOAP:标准的传输协议
SOAP是标准化的消息协议,是客户端送给服务器希望调用的类和方法的一种消息格式,也包括服务返回的消息格式。之所以有SOAP是因为只有大家都遵守一套消息格式的标准,相互之间才能明白对方想要干什么。
SOAP是Web Service的标准传输协议,是Simple Object Application Propotol的简写,是一种标准化的传输消息的XML格式。
SOAP请求消息将客户端的服务请求消息发给服务器,比如想调用什么接口,以及接口的参数值等。SOAP答复消息是从服务器返回给客户端的消息,如接口实现类调用后的返回值或是调用服务时的错误信息等。定义WSDL是很重要的,一旦WSDL定义好了,再根据WSDL的输入变量和输出变量的结构就可以知道SOAP的请求消息和响应消息的格式了。
UDDI:服务的公共网址
UDDI是Universal Description Discovery and Intergretion的缩写,是一种创建注册服务的规范,以便大家将自己的Web Service进行注册发布供使用者查找。
当服务提供者想将自己的Web Service发布,以便外部能找到其服务时,那么服务提供这可以将自己的Web Service注册到相应的UDDI商用注册网站。
UDDI并非一个必须的Web Service组件,服务方完全可以不进行UDDI的注册。因为WSDL文件中已经给出了Web Service的地址URI,外部可以通过它进行相应的Web Service调用。
以下是一个Web Service示例程序,主要参考了梁爱虎的《SOA 思想,技术与系统集成应用详解》中的例子:
发布Web服务的类接口:
package
com.heyang;
/**
* 生成序列号的接口
* @author : 何杨([email protected])
* @date: 2009-9-29-下午12:37:55
*/
public interface ISerial{
/**
* 传入类型,返回序列号
* @param type
* @return
*/
public String getSN(String type);
}
/**
* 生成序列号的接口
* @author : 何杨([email protected])
* @date: 2009-9-29-下午12:37:55
*/
public interface ISerial{
/**
* 传入类型,返回序列号
* @param type
* @return
*/
public String getSN(String type);
}
发布web服务的类:
package
com.heyang;
import java.text.MessageFormat;
/**
* ISerial的实现类
* @author : 何杨([email protected])
* @date: 2009-9-29-下午12:40:05
*/
public class SerialService implements ISerial{
private static int number;
/**
* 产生SN:CD-000001的序列号
* MessageFormat的用法可参考http://hi.baidu.com/gacmotor/blog/item/372b4a3a0b010de314cecb0b.html
*/
public String getSN(String type) {
number ++ ;
Object[] arr = new Object[]{type,number};
String result = MessageFormat.format( " SN:{0}-{1,number,000000} " ,arr);
return result;
}
public static void main(String[] args){
SerialService s = new SerialService();
System.out.println(s.getSN( " CD " ));
}
}
import java.text.MessageFormat;
/**
* ISerial的实现类
* @author : 何杨([email protected])
* @date: 2009-9-29-下午12:40:05
*/
public class SerialService implements ISerial{
private static int number;
/**
* 产生SN:CD-000001的序列号
* MessageFormat的用法可参考http://hi.baidu.com/gacmotor/blog/item/372b4a3a0b010de314cecb0b.html
*/
public String getSN(String type) {
number ++ ;
Object[] arr = new Object[]{type,number};
String result = MessageFormat.format( " SN:{0}-{1,number,000000} " ,arr);
return result;
}
public static void main(String[] args){
SerialService s = new SerialService();
System.out.println(s.getSN( " CD " ));
}
}
Web.xml:
<?
xml version="1.0" encoding="UTF-8"
?>
< web-app >
< servlet >
< servlet-name > AxisServlet </ servlet-name >
< servlet-class >
org.apache.axis.transport.http.AxisServlet
</ servlet-class >
</ servlet >
< servlet-mapping >
< servlet-name > AxisServlet </ servlet-name >
< url-pattern > /servlet/AxisServlet </ url-pattern >
</ servlet-mapping >
< servlet-mapping >
< servlet-name > AxisServlet </ servlet-name >
< url-pattern > *.jws </ url-pattern >
</ servlet-mapping >
< servlet-mapping >
< servlet-name > AxisServlet </ servlet-name >
< url-pattern > /services/* </ url-pattern >
</ servlet-mapping >
</ web-app >
< web-app >
< servlet >
< servlet-name > AxisServlet </ servlet-name >
< servlet-class >
org.apache.axis.transport.http.AxisServlet
</ servlet-class >
</ servlet >
< servlet-mapping >
< servlet-name > AxisServlet </ servlet-name >
< url-pattern > /servlet/AxisServlet </ url-pattern >
</ servlet-mapping >
< servlet-mapping >
< servlet-name > AxisServlet </ servlet-name >
< url-pattern > *.jws </ url-pattern >
</ servlet-mapping >
< servlet-mapping >
< servlet-name > AxisServlet </ servlet-name >
< url-pattern > /services/* </ url-pattern >
</ servlet-mapping >
</ web-app >
wsdd文件server-config.wsdd
<?
xml version="1.0" encoding="UTF-8"
?>
< deployment xmlns ="http://xml.apache.org/axis/wsdd/"
xmlns:java ="http://xml.apache.org/axis/wsdd/providers/java" >
< handler type ="java:org.apache.axis.handlers.http.URLMapper"
name ="URLMapper" />
< service name ="fetchSerialNumber" provider ="java:RPC" >
< parameter name ="className" value ="com.heyang.SerialService" />
< parameter name ="allowedMethods" value ="getSN" />
</ service >
< transport name ="http" >
< requestFlow >
< handler type ="URLMapper" />
</ requestFlow >
</ transport >
</ deployment >
< deployment xmlns ="http://xml.apache.org/axis/wsdd/"
xmlns:java ="http://xml.apache.org/axis/wsdd/providers/java" >
< handler type ="java:org.apache.axis.handlers.http.URLMapper"
name ="URLMapper" />
< service name ="fetchSerialNumber" provider ="java:RPC" >
< parameter name ="className" value ="com.heyang.SerialService" />
< parameter name ="allowedMethods" value ="getSN" />
</ service >
< transport name ="http" >
< requestFlow >
< handler type ="URLMapper" />
</ requestFlow >
</ transport >
</ deployment >
测试类:
package
com.heyang.client;
import java.net.MalformedURLException;
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
/**
* WebServiceClientTest
* @author : 何杨([email protected])
* @date: 2009-9-29-下午01:03:05
*/
public class WebServiceClientTest {
public static void main(String[] args) throws ServiceException,
MalformedURLException, RemoteException {
// 标识Web Service的具体路径
/**
* SerialNumber:发布到Tomcat上的war的名称,采用工程名
* services:固定写法,与Web.xml中设定对应
* fetchSerialNumber:server-config.wsdd中设定的service名
*/
String endpoint = " http://localhost:8080/SerialNumber/services/fetchSerialNumber " ;
// 创建 Service实例
Service service = new Service();
// 通过Service实例创建Call的实例
Call call = (Call) service.createCall();
// 将Web Service的服务路径加入到call实例之中.
call.setTargetEndpointAddress( new java.net.URL(endpoint)); // 为Call设置服务的位置
// 调用Web Service的方法
call.setOperationName( " getSN " );
// 调用Web Service,传入参数
String retval = (String) call.invoke( new Object[] { " CD " });
System.out.println(retval);
}
}
import java.net.MalformedURLException;
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
/**
* WebServiceClientTest
* @author : 何杨([email protected])
* @date: 2009-9-29-下午01:03:05
*/
public class WebServiceClientTest {
public static void main(String[] args) throws ServiceException,
MalformedURLException, RemoteException {
// 标识Web Service的具体路径
/**
* SerialNumber:发布到Tomcat上的war的名称,采用工程名
* services:固定写法,与Web.xml中设定对应
* fetchSerialNumber:server-config.wsdd中设定的service名
*/
String endpoint = " http://localhost:8080/SerialNumber/services/fetchSerialNumber " ;
// 创建 Service实例
Service service = new Service();
// 通过Service实例创建Call的实例
Call call = (Call) service.createCall();
// 将Web Service的服务路径加入到call实例之中.
call.setTargetEndpointAddress( new java.net.URL(endpoint)); // 为Call设置服务的位置
// 调用Web Service的方法
call.setOperationName( " getSN " );
// 调用Web Service,传入参数
String retval = (String) call.invoke( new Object[] { " CD " });
System.out.println(retval);
}
}
输出示例:
SN:CD
-
000004
例程下载(使用Axis,注意Tomcat的lib目录中要包括mail.jar和activation.jar):
http://www.blogjava.net/Files/heyang/SerialNumber20090929130453.rar
使用说明:
使用Ant脚本将jar包打好,再部署到Tomcat中,可以用http://localhost:8080/SerialNumber/services来测试一下是否有输出,有则表示部署成功,之后执行WebServiceClientTest。
主要参考资料:
梁爱虎著《SOA 思想,技术与系统集成应用详解》