webservice基本功能介绍
WebService, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据WebService规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据,通俗的讲,WebService就是一个向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web来调用这个应用程序。我们把调用这个WebService 的应用程序叫做客户端,发布这个web服务的机应用程序器称为WebService服务器
webservice有着许多优势:
1)异构平台的互通性
理论上, WebService 最大的优势是提供了异构平台的无缝街接技术手段。由于不同的用户使用不同的硬件平台,不同的操作平台,不同的操作系统,不同的软件,不同的协议通信,这就产生了互相通信的需求。 Web Service 使任何两个应用程序,只要能读写XML,那么就能互相通信。
2)更广泛的软件复用
软件的复用技术通过组合已有模块来搭建应用程序,能大幅度提高软件的生产效率和质量。用户只要获得了描述 WebService 的 WSDL 文件,就可以方便地生成客户端代理,并通过代理访问 WebService 。
3)成本低、可读性强、应用范围广
WebService 可用基于 XML 的 SOAP 来表示数据和调用请求。并且通过 HTTP 协议传输 XML 格式的数据
4)迅捷的软件发行方式
WebService 将彻底地改变软件的发行方式。软件供应商可以把软件分解成若WebService 模块构成的系统,直接在 Web 上发布
webservice常用的专业术语:
1)XML: Extensible Markup Language -扩展性标记语言XML,用于传输格式化的数据,是Web服务的基础。
• namespace-命名空间。
• xmlns=“http://asen.cn” 使用默认命名空间。
• xmlns:itcast=“http://asen.cn”使用指定名称的命名空间。
2)WSDL: WebService Description Language – Web服务描述语言。调用该webservice api 的接口描述
•通过XML形式说明服务在什么地方-地址。
•通过XML形式说明服务提供什么样的方法 – 如何调用。
3)SOAP: Simple Object Access Protocol(简单对象访问协议)
•SOAP作为一个基于XML语言的协议用于有网上传输数据。
•SOAP = 在HTTP的基础上+XML数据。
•SOAP是基于HTTP的。
•SOAP的组成如下:
1. Envelope – 必须的部分。以XML的根元素出现。
2. Headers – 可选的。
3. Body – 必须的。在body部分,包含要执行的服务器的方法。和发送到服务器的数据。
webservice服务调用方式一:
通过get调用
public static void get(String mobileCode, String userID){ URL url = null; try {
url = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo?"
+ "mobileCode=" + mobileCode + "&userID=" + userID); HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET"); if(connection.getResponseCode() == HttpURLConnection.HTTP_OK){
InputStream is = connection.getInputStream(); ByteArrayOutputStream boas=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int len=-1;
while((len=is.read(buffer))!=-1){
boas.write(buffer, 0, len);
} System.out.println("GET请求获取的数据:"+boas.toString());
boas.close();
is.close();
} } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
通过post调用
public static void post(String mobileCode, String userID){
HttpClient client = new HttpClient(); PostMethod method = new PostMethod("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo"); method.setParameter("mobileCode", mobileCode);
method.setParameter("userID", userID); try {
int code = client.executeMethod(method); String result=method.getResponseBodyAsString();
System.out.println("Post请求的结果:"+result);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
通过SOAP1.1方式
webservice服务调用方式二:
public static void postSoap1() throws Exception {
// 创建一个post请求,类似Post请求
PostMethod postMethod = new PostMethod("http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx");
// 设置传送信息的格式
postMethod.setRequestHeader("Content-Type","text/xml; charset=utf-8");
postMethod.setRequestBody(new FileInputStream("C:/a.txt"));
int code = http.executeMethod(postMethod);
System.out.println("消息码为:" + code);
System.out.println("返回的消息为:" + postMethod.getResponseBodyAsString());
postMethod.releaseConnection();
}
通过java方式访问
这种方式首先要获取wsdl文件.使用JDK1.6以上的版本的wsimport命令,相关命令有
wsimport -encoding utf-8 -s ./ C:\Users\Asen\Desktop\WeatherWS.asmx.xml |
wsimport -encoding utf-8 -s ./ http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?WSDL |
可以把class文件打成jar包 jar cvf test.jar 打包目录,拷贝到项目中调参考WSDL用即可调用源码如下:
public static void main(String[] args) {
MobileCodeWS mobileCodeWs=new MobileCodeWS();
MobileCodeWSSoap mobileCodeWSSoap=mobileCodeWs.getMobileCodeWSSoap();
String tel=mobileCodeWSSoap.getMobileCodeInfo("18373551982",null);
System.out.println(tel);
}
我们也可以自己创建一个webservice服务
步骤一:创建一个web服务
/**
* 声明:@webservice
* 发布:EndPoint
* @author Asen
*
*/
@WebService(serviceName="PhoneManager"//修改服务名
, targetNamespace="http://aa.ws.com.asen")//修改命名空间
public class PhoneService { /*
* @WebParam注解修改参数名
* @WebResult修改返回参数名字
*/
@WebMethod(operationName="getMobileInfo")//修改方法名
public @WebResult(name="phone")Phone getPhoneInfo(@WebParam(name="osName")String osName){
Phone phone = new Phone(); if(osName.endsWith("android")){
phone.setName("android");
phone.setOwner("google");
phone.setTotal(80);
}else if (osName.endsWith("ios")) {
phone.setName("ios");
phone.setOwner("apple");
phone.setTotal(15);
}else {
phone.setName("windows phone");
phone.setOwner("microsoft");
phone.setTotal(15);
} return phone;
} @WebMethod(exclude=true)//将该方法排除在外
public void sayHello(String city){
System.out.println(city);
}
}
步骤二:
/*
* 发布webservice
*/
public static void main(String[] args) {
String address1="http://localhost:8888/ws/phoneService";
String address2="http://localhost:8888/ws/phoneManager";
Endpoint.publish(address1, new PhoneService());
Endpoint.publish(address2, new PhoneService()); System.out.println("wsld地址:" + address1 + "?WSDL");
}
接下来调用即可,对于webservice,Apache开发了一个开源的框架CXF,CXF 帮助您来构建和开发 Services 这些 Services 可以支持多种协议,比如:SOAP、POST/HTTP、RESTful HTTP CXF 大大简化了 Service可以天然地和 Spring 进行无缝集成。CXF有两种发布方式,方式一利用ServerFactoryBean来发布web服务,方式二利用JaxWsServerFactoryBean来发布web服务
public static void main(String[] args) {
LanguageService languageService=new LanguageServiceImpl();
ServerFactoryBean bean=new ServerFactoryBean();
//Endpoint :地址 , 实现对象
bean.setAddress("http://192.168.114.10:9999/ws/cxf/languangeService");
bean.setServiceClass(LanguageService.class);//对外提供webservcie的业务类或者接口
bean.setServiceBean(languageService);//服务的实现bean
bean.create();//创建,发布webservice
System.out.println("wsdl地址:http://192.168.114.10:9999/ws/cxf/languangeService?WSDL");
} public static void main(String[] args) {
LanguageService languageService=new LanguageServiceImpl();
JaxWsServerFactoryBean bean=new JaxWsServerFactoryBean();
//Endpoint :地址 , 实现对象
bean.setAddress("http://192.168.114.10:9999/ws/cxf/languangeService");
bean.setServiceClass(LanguageService.class);//对外提供webservcie的业务类或者接口
bean.setServiceBean(languageService);//服务的实现bean
//添加输入拦截器 :输入显示日志信息的拦截器
bean.getInInterceptors().add(new LoggingInInterceptor());
//添加输出拦截器 :输出显示日志信息的拦截器
bean.getOutInterceptors().add(new LoggingOutInterceptor()); bean.create();//创建,发布webservice
System.out.println("wsdl地址:http://192.168.114.10:9999/ws/cxf/languangeService?WSDL");
}
我们需要注意的是利用ServerFactoryBean来发布web服务没有添加webService注解,也就是说没有注解也可以发布webService服务,但是这种方式不是很规范,比如我们不可以通过注解的方式来修改WSDL的标签信息,JaxWsServerFactoryBean是ServerFactoryBean的子类,也是功能扩展类。此类,必须要在被发布为服务的类上添加@WebService注解,如果不加注解,虽然不出错,但也不会对外暴露任何方法。使用此类生成的wsdl文件更加规范,更重要的是可以通过添加拦截器拦截请求。
<servlet>
<servlet-name>cxf</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cxf</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
然后通过Spring配置文件发布服务
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<!-- 这样配置自身的服务也可以使用 -->
<bean id="userImpl" class="com.asen.i.cxf.spring.ws.UserImpl" />
<!-- id:逻辑名 serviceClass=服务接口类 address:调用的路径 http://localhost:8888/项目名/ws/hello?wsdl> -->
<jaxws:server id="userService" serviceClass="com.asen.cxf.spring.ws.IUser" address="/hello">
<jaxws:serviceBean>
<ref bean="userImpl" />
</jaxws:serviceBean>
<jaxws:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
</jaxws:inInterceptors>
<jaxws:outInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
</jaxws:outInterceptors>
</jaxws:server>
</beans>
服务接口如下
@WebService
public interface IUser {
public void saveUser(User user);
public User getUser(int uid);
}
服务类如下:
public class UserImpl implements IUser {
private List<User> users=new ArrayList<User>(); public User getUser(int uid) {
for(User temp:users){
if(temp.getUid()==uid){
return temp;
}
}
return null;
}
public void saveUser(User user) {
// TODO Auto-generated method stub
users.add(user);
}
}
webservice基本功能介绍的更多相关文章
- WebService的简单介绍与入门使用
WebService是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式 ...
- .NET平台开源项目速览(13)机器学习组件Accord.NET框架功能介绍
Accord.NET Framework是在AForge.NET项目的基础上封装和进一步开发而来.因为AForge.NET更注重与一些底层和广度,而Accord.NET Framework更注重与机器 ...
- 微信小程序产品定位及功能介绍
产品定位及功能介绍 微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验. 小程序注册 注册小程序帐号 在微信公众平台官网首页(mp.weixin.qq ...
- 带你走近AngularJS - 基本功能介绍
带你走近AngularJS系列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自定义指令 ------------- ...
- MWeb 1.4 新功能介绍一:引入文件夹到 MWeb 中管理,支持 Octpress、Jekyll 等静态博客拖拽插入图片和实时预览
之前在 MWeb 中打开非文档库中的 Markdown 文档,如果文档中有引用到本机图片,是没办法在 MWeb 中显示出来和预览的.这是因为 Apple 规定在 Mac App Store(MAS) ...
- Joomla软件功能介绍与开源程序大比拼Joomla,wordpress,Drupal哪个好?
Joomla 软件功能介绍: Joomla!是一套在国外相当知名的内容管理系统 (Content Management System, CMS),它属于Portal(企业入口网站)类型,顾名思义 ...
- CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系
CentOS版本历史 版本 CentOS版本号有两个部分,一个主要版本和一个次要版本,主要和次要版本号分别对应于RHEL的主要版本与更新包,CentOS采取从RHEL的源代码包来构建.例如CentOS ...
- python中列表、元组、字典内部功能介绍
一.列表(list) 常用功能的介绍:
- 网页引导:jQuery插件实现的页面功能介绍引导页效果
现在很多网站不仅是介绍,更多的是有一些功能,怎么样让客户快速的知道网站有哪些功能呢?这里pagewalkthrough.js插件能帮我们实现,它是一个轻量级的jQuery插件,它可以帮助我们创建一个遮 ...
随机推荐
- Java数据结构整理(一)
ava数据结构内容整理关键字: 数据结构 Collection:List.SetMap:HashMap.HashTable如何在它们之间选择一.Array , ArraysJava所有“存储及随机访问 ...
- SVN下载分支、合并分支
http://www.cnblogs.com/armyfai/p/3985660.html(不知道实际工作中怎么使用,有好多步骤感觉不是太理解) 从远处把库fork到本地,会有一个库文件夹 服务器库结 ...
- Linux内存布局
在上一篇博文里,我们已经看到Linux如何有效地利用80x86的分段和分页硬件单元把逻辑地址转换为线性地址,在由线性地址转换到物理地址.那么我们的应用程序如何使用这些逻辑地址,整个内存的地址布局又是怎 ...
- Delphi中上指定进程(进程名)
procedure KillProcess(ExeName: string); const PROCESS_TERMINATE = $0001; //进程的PROCESS_TERMINATE访问权限 ...
- CSS BUG 总结
1.IE7 容器使用了滚动条 其子元素中使用 position:relative ,position变成了fixed,从而不随容器的滚动条滚动; 解决: 在其容器元素的属性中也加入 position ...
- return_url和notify_url的区别
页面跳转同步通知页面特性(return_url特性) (1) 买家在支付成功后会看到一个支付宝提示交易成功的页面,该页面会停留几秒,然后会自动跳转回商户指定的同步通知页面(参数return_url ...
- js url参数的获取和设置以及删除
//获取url参数的值:name是参数名 function getQueryString(name) { var reg = new RegExp("(^|&)" + na ...
- C实现类、继承、多态
首先考虑用C实现类 肯定是要使用struct的,类的数据成员放在struct里面: 而类有构造函数.析构函数,这两个函数必须在struct外面,构造函数要分配struct空间并初始化struct成员, ...
- 算法一之N皇后问题
(写这篇文章主要是明天就要考试了,算法考试,今天不想再复习了,xiang着今天也开通了博客,于是在这个平台上进行复习,应该会更高效.最后祝愿我明天考个好成绩.嘻嘻...) n皇后问题,主要是应用到回溯 ...
- java算法 蓝桥杯 乘法运算
问题描述 编制一个乘法运算的程序. 从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出. 输入格式 输入只有一行,是两个用空格隔开的数字,均在1~99之间(含1和99). 输出格式 输出为4行 ...