WebService简介

Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。

简单的说,WebService就是一种跨编程语言和跨操作系统平台的远程调用技术。所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然。跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。 远程调用,就是一台计算机的应用可以调用其他计算机上的应用。例如:支付宝,支付宝并没有银行卡等数据,它只是去调用银行提供的接口来获得数据。还有天气预报等,也是气象局把自己的系统服务以webservice服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能。

WebService原理

XML,SOAP和WSDL就是构成WebService平台的三大技术 。

  • WebService采用Http协议来在客户端和服务端之间传输数据。WebService使用XML来封装数据,XML主要的优点在于它是跨平台的。

  • WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议规定的。

  • WebService服务器端首先要通过一个WSDL文件来说明自己有什么服务可以对外调用。简单的说,WSDL就像是一个说明书,用于描述WebService及其方法、参数和返回值。 WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:1.注册到UDDI服务器,以便被人查找;2.直接告诉给客户端调用者。

WebService实例

本实例演示在服务端创建接口并在客户端调用的过程,创建两个不同项目用来模拟两台机器,一个项目代表服务端,另一个代表客户端

本实例模拟调用端口来获得一些学生的信息

服务端

1.先编写一个接口

import java.util.List;public interface Test {//查询学生成绩List scores(String stuName);//查询学生年龄int age(String stuName);//查询学生老师String teacher(String stuName);}

2.编写接口的实现类

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import java.util.ArrayList;
import java.util.List;@WebService(targetNamespace = "http://test",name = "TestSOAP",portName = "ComputerSOAPPort",serviceName = "TestWSS"
)
public class TestImpl implements Test{@WebMethod(operationName = "queryScores",exclude = false)@Overridepublic @WebResult(name = "scoresResult") List scores(@WebParam(name = "stuName") String stuName) {List list = new ArrayList();list.add("语文:99");list.add("数学:95");list.add("英语:100");return list;}@WebMethod(operationName = "queryAge",exclude = false)@Overridepublic @WebResult(name = "ageResult") int age(@WebParam(name = "stuName") String stuName) {return 8;}@WebMethod(operationName = "queryTeacher",exclude = false)@Overridepublic @WebResult(name = "teacherResult") String teacher(@WebParam(name = "stuName") String stuName) {return "嘵奇老师";}
}

3.发布服务

import javax.xml.ws.Endpoint;public class TestServer {public static void main(String[] args) {Endpoint.publish("http://127.0.0.1:2222/test",new TestImpl());System.out.println("服务端启动成功");}
}

4.测试服务是否发送成功

通过阅读wsdl,确定客户端调用的接口、方法、参数和返回值存在,证明服务发布成功

我们在浏览器输入 http://127.0.0.1:2222/test?wsdl 来获取wsdl文件进行阅读

wsdl,是以XML文件形式来描述WebService的”说明书”,有了说明书,我们才可以知道如何使用或是调用这个服务.

现在我们还不知道怎么去阅读,后面我们会详解,只要能获取到,就能确定WebService服务发布成功

服务端完成,接下来就是客户端

客户端

客户端调用服务有很多种方法,我们先用工具生成客户端代码,后面会详解
wsimport是jdk自带的webservice客户端工具,可以根据wsdl文档生成客户端调用代码(java代码).当然,无论服务器端的WebService是用什么语言写的,都可以生成调用webservice的客户端代码。

1.创建一个客户端空项目,cmd命令行进入此项目的src目录
使用以下命令生成客户端代码

wsimport -p com.cad.demo -s . http://127.0.0.1:2222/test?wsdlcom.cad.demo是路径-s是指编译出源代码文件,后面的.(点)指將代码放到当前目录下.最后面的http….是指获取wsdl说明书的地址


可以看到已经下载进来了

2.编写客户端

package com.cad.test;import com.cad.demo.TestSOAP;import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.io.IOException;
import java.net.URL;
import java.util.List;public class Demo01 {public static void main(String[] args) throws IOException {//创建WSDL文件的URLURL url = new URL("http://127.0.0.1:2222/test");//创建服务名称  namespaceURL 命名空间 localPart服务视图名QName name = new QName("http://test","TestWSS");Service service = Service.create(url,name);//获取服务实现类TestSOAP testSOAP = service.getPort(TestSOAP.class);//调用方法List list = testSOAP.queryScores("小明");int age = testSOAP.queryAge("小红");String teacher = testSOAP.queryTeacher("小张");System.out.println(list);System.out.println(age);System.out.println(teacher);}
}

结果:

分析

以上这种方式需要我们下载到本地类,这样的话如果服务端修改了接口我们还需要重新下载,这样就不太方便,于是我们可以利用下面这种方法,不需要下载到本地就能实现远程接口的调用

1.创建一个Maven项目导入如下依赖

<dependencies><dependency><groupId>org.apache.axis</groupId><artifactId>axis</artifactId><version>1.4</version></dependency><dependency><groupId>commons-discovery</groupId><artifactId>commons-discovery</artifactId><version>0.2</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>org.apache.axis</groupId><artifactId>axis-jaxrpc</artifactId><version>1.4</version></dependency><dependency><groupId>org.apache.axis</groupId><artifactId>axis-saaj</artifactId><version>1.4</version></dependency><dependency><groupId>wsdl4j</groupId><artifactId>wsdl4j</artifactId><version>1.4</version></dependency></dependencies>

2.编写客户端
这里要说明的是没写服务端的原因是服务端的代码正常写就可以。不需要改动,我这里写的是模拟获取城市天气的功能

package com.www;import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;
import java.rmi.RemoteException;public class Demo01Client {public static void main(String[] args) throws ServiceException, RemoteException {//远程调用路径String url = "http://127.0.0.1:12345/weather?wsdl";Service service = new Service();try {Call call = (Call) service.createCall();call.setTargetEndpointAddress(url);//nameSpaceURL是要指向的命名空间的名称 localPart是要调用的方法名call.setOperationName(new QName("http://service.cad.com", "getWeather"));//paramName是参数名 参数类型:spring  参数模式:IN或者OUTcall.addParameter("cityName", XMLType.XSD_STRING, ParameterMode.IN);//返回值类型:Springcall.setReturnType(XMLType.XSD_STRING);//传入参数String temp = "长春";Object[] objects = new Object[]{temp};//远程调用String result = (String) call.invoke(objects);System.out.println(result);}catch (Exception e){e.printStackTrace();}}
}

结果:

WSDL文档

可以看到我们没有下载到本地类就实现了远程接口的调用,大家可以自行测试一下

Java远程调用WebService接口相关推荐

  1. java axis2 调用webservice 接口_Axis2 调用Webservice 接口 | 学步园

    调用方法: TranslatorString  输入中文,翻译成 拼音.英文. 参数:wordKey(中文) 现在要做,翻译词:[随便],代码如下: package cn.com.webxml; im ...

  2. java 调用webservice接口

    RPC调用webservice接口 maven支持包: <dependency><groupId>javax.xml.rpc</groupId><artifa ...

  3. Java使用XFire调用WebService接口

    看了一些Java调用WebService接口的例子,很多都是Ctrl+C,Ctrl+V的,其中有很多拿来使用后发现有错误,令人郁闷,特此写了一篇经过测试的,只是一个小例子. 服务端(为客户端提供Web ...

  4. java用axis方式调用webservice接口

    最近需要使用webservice接口,所以总结了一下全过程,希望能够对大家有所帮助. 开发使用的项目框架是ssm框架,tomcat服务器. 首先我们会拿到一个调用webservice接口的网址,类似这 ...

  5. Java,Axis方式调用WebService接口,支持多参数

    package com.demo.modules.si.util;import org.apache.axis.client.Call; import javax.xml.rpc.ParameterM ...

  6. java使用axis2调用webservice接口实例

    说明:我目前的项目环境是struts2+spring+mybatis+oracle,以下代码是java使用axis2调用webservice接口实例. import javax.xml.namespa ...

  7. java:AXIS调用webService接口,返回String类型xml,并用dom4j简单解析xml

    一.使用axis调用webService接口,返回String类型xml 1.导入axis依赖 2.直接贴代码 /*** 调用webservice接口的方法,并返回String类型的xml* @par ...

  8. java调用接口速度慢,Java 调用 webservice 接口,为什么这么慢

    Java 调用 webservice 接口,为什么这么慢,有没有好的优化方案,本人目前改成 http 方式发 soap 消息调用,速度依旧很慢,维持在平均 100ms 下不来. 之前用 cxf 的 J ...

  9. JAVA使用HttpClient调用webservice接口

    JAVA使用HttpClient调用webservice接口 关于HttpClient用法参考: HttpClient-4.5.2官方教程完整翻译 官方教程原文链接 HttpClient下载地址: 链 ...

最新文章

  1. MySQL删除表及删除表数据操作
  2. 盘点 IDEA2020.3 那些炫酷的插件,超级好用的那种
  3. python可以自学吗-python自学行吗
  4. python @property
  5. python学习之自习语法(20180626_update)
  6. uniapp 支付(支付宝,微信支付)
  7. B4.Java web部分
  8. c/c++教程 - 2.4.2.6 初始化列表语法,初始化列表参数
  9. js中函数返回值return
  10. Java设计模式----工厂模式-----简单工厂(静态工厂模式)
  11. JQMeter进度条动态加载演示
  12. Nginx安全配置标准(for proxy)
  13. 五大常用算法:贪心算法
  14. Python求指定范围内质数与合数-详解
  15. jieba分词的基本用法和词性标注
  16. 【转】ACM各种WA的说明及可能的原因
  17. semantic ui中文文档_求你别再用swagger了,给你推荐几个在线文档生成神器
  18. c++的*号是否有空格的区别以及char*转std::vector<float>解析
  19. SSD、DSSD算法详解
  20. 局域网监控软件有哪些功能

热门文章

  1. 复杂网络分析(三)(UCINET)
  2. 圆的扫描转换-中点Bresenham算法
  3. 使用vue+zrender绘制体温单 三测单(1)
  4. git客户端msysGit和TortoiseGit使用
  5. 一款能统计能存储日志设置超时时间的ping工具
  6. 推荐系统中的用户偏好
  7. php框架审计,关于ThinkPHP框架的审计
  8. 解决Microsoft Store无法下载软件问题
  9. 值得细细品读的URL资源
  10. 职场中你的岗位竞聘PPT是怎么做的?