WebService重学(自用)

乱花渐欲迷人眼,浅草才能没马蹄!
接触一个新技术的时候,脑海中总是会跳出这句诗。附庸风雅,非我本意。主要还是因为很多网络学习资料,把简单的东西搞得很复杂;该有内涵的时候,又俗不可耐。
前段时间,写过一篇博客记录webservice的学习,今天回头一看,也成了垃圾。今天就再重新梳理一下。
不严谨的给个官方定义:不会说,不说了。

首先说接口开发,很多人人为的把这个概念搞复杂了。

一、现在简单说下我接触过的接口协议都有哪些:

1.socket通信,这个是我第一次接触接口接触的接口通信方式。(老复杂了)
2.webservice协议,在socket之后用的比较普遍的传输方式。
3.http和https,目前流行的传输方式,大部分公司都用这种。
4.ftp传输,其实ftp传输应该放在第一位,ftp是最早做数据交换的方式,就是开通个22或21端口,往对方服务器发文件,对方得到文件后在解析获取数据。
二、协议说完了,我们在来说下传输的数据方式和结构。
1.符号隔开法,最早的数据方式是一串字符串,用各种特殊符号隔开,然后通过截取符号的前面,后面或之间,来获取数据。(贼累,眼睛要看花的)
2.xml(可扩展标记语言)结构,教程地址:http://www.runoob.com/xml/xml-tutorial.html 这种流行很长一段时间,公司双方定义xml的根元素和子元素,双方开发人员都按照根元素和子元素,在里面赋值,取值,现在很多开源框架都还用xml作为存储和配置文件。
3.json(JavaScript Object Notation, JS 对象简谱),教程地址:http://www.runoob.com/json/json-tutorial.html 目前流行的数据传输格式,简洁,方便,易懂基本全占。目前公司都建议用json结构传输。
选自:https://www.cnblogs.com/zhouxuejia/p/9318391.html

webservice作用两个方面
1)异构系统信息交互。(例如:一个公司,a系统要使用b系统数据,两个系统甚至可能不是同一个语言开发的)
2)公共资源使用。(例如:手机应用、pc的浏览器等都使用气象局天气预报信息)
跨平台,跨语言,远程。

涉及几个概念:
1)soap协议,soap协议=http+XML。http实现通讯,XML是数据格式。由此其实可以看出一点,webservice发送的请求是POST,get必然不适用于放这堆XML信息。
2)WSDL:服务端接口的说明书。
webservice有很多优点,但个人认为,这个破玩意,现在完全可以被其他技术替代。之所以还有很多人用,可能时因为早期webservice流行那阵,开发的那帮人好些都是架构师了。他们定的用,那就用了呗。

我以前一直错误理解webservice是个技术,现在有了不同理解。我觉得webservice可以理解成异构系统间通讯的一种行为。传统的webservice是soap+xml的形式,现在的webservice完全可以是http+json,而且更好用。以下所说的还是,传统形式的webservice。
1.入门,JavaAPI实现简单的webservice接口发布和调用。帮助理解,开发没有用的。
1)创建普通Java项目,写个接口及实现。
在这里插入图片描述
2)实现上加个@WebService注解,注解是jdk的,表明其是个webservice服务。以前老听人说基于jws开发webservice,搞得我有点头晕,现在看看神马玩意。
在这里插入图片描述
3)写个main方法,发布服务。在这里插入图片描述地址扔到浏览器可以看到说明书。
在这里插入图片描述
在这里插入图片描述
4)创建普通Java项目,打开dos窗口,进入项目src文件夹下,执行相关命令如图(教程使用的eclipse,目前流行的idea可以直接在ide中设置生成代码,但实际开发中一般不会采用在客户端生成代码的方式,所以不介绍idea的了)。回到开发工具,发现src下生成了一堆代码。
在这里插入图片描述
5)main方法调用服务端方法。
在这里插入图片描述
三个红框分别对应wsdl的:
在这里插入图片描述
在这里插入图片描述
运行main方法,查看结果。
在这里插入图片描述
在这里插入图片描述

客户端代码也可以这样实现(一样只不过讲创建服务视图对象拆成了三部分而已):
在这里插入图片描述

2.还可以单独调用第三方接口。
调用第三方接口(例如网络上提供的查询电话号码归属地),不需要写服务端,根据发布的wsdl文件写一个客户端即可。方法同上客户端开发相同。
注意:如果第三方接口使用其他语言开发的可能在wsimport命令时会报错,需要修改wsdl文件。
以天气预报接口为例,在wsimport命令生成客户端代码时报错如下:
在这里插入图片描述
这是因为这个接口是.NET开发的,不能拿过来直接用,需要讲wsdl文件做一下修改。这个文件是发布到网络的无法直接修改。将其下载后者复制到本地。在本地完成修改,wsimport -s .后边的地址填写该文件在本地的地址即可。
在这里插入图片描述
客户端代码示例:
在这里插入图片描述

3.以上是比较原始直观的方式实现发送请求,接收数据。webservice是通过soap协议来收发数据的。仔细观察客户端代码会发现根本就没有发送XML格式的数据。这是因为wsimport的方式在客户端生成代码,具体发送的xml格式数据我们没有看到。实际企业开发中一般是需要拼接成xml格式然后发送的。
首先,我们先看一下,以上方式底层究竟发送了什么格式的数据。{}内的内容只是为了看下底层数据格式,没有特别大的实际意义,可以跳过。
{
我本将心向明月,奈何明月照沟。

我本来想用POSTMAN做下监控,没成想不会用。问了美团40k大神,不会用。。。无奈把项目扔回eclipse用的内置工具TCP/IP Monitor。
windows 中找到如下
在这里插入图片描述
设置完成后,将哭护短代码改成本地地址+上图第一个框的端口。(也是因为这一步要配置地址。所以要使用第二种比较复杂的访问方式)
在这里插入图片描述
在这里插入图片描述
如下为:发送的信息和接受的信息(直截取了实际内容相关的):

<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:queryWeather xmlns:ns2="http://ws.scbg.com/">
<arg0>比尔吉沃特</arg0>
</ns2:queryWeather>
</S:Body></S:Envelope>
5e
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
a6
<ns2:queryWeatherResponse xmlns:ns2="http://ws.scbg.com/">
<return>今天天气好晴朗,处处放光芒!</return>
</ns2:queryWeatherResponse>
</S:Body>
</S:Envelope>
0

}

4.接下来,就可以手动模拟这样的数据格式数据发送:
服务端不用动!在客户端程序做如下操作:
首先创建方法拼接xml格式字符串:

/**
	 * 拼接xml信息方法
	 * @param cityName
	 * @return
	 */
	public static String getXML(String cityName){
		StringBuilder sb= new StringBuilder();
		sb.append("<?xml version=\"1.0\" ?>");
		sb.append("<S:Envelope xmlns:S=\"http://schemas.xmlsoap.org/soap/envelope/\">");
		sb.append("<S:Body>");
		sb.append("<ns2:queryWeather xmlns:ns2=\"http://ws.scbg.com/\">");
		sb.append("<arg0>"+cityName+"</arg0>");
		sb.append("</ns2:queryWeather>");
		sb.append("</S:Body>");
		sb.append("</S:Envelope>");
		return sb.toString();

	}

编写客户端代码:

public static void main(String[] args) throws IOException, InterruptedException {
		//获取url对象,以创建连接
		URL url=new URL("http://192.168.0.113:8080/weatherService666");
		//获取连接对象,注意转型,上层父类没有获取连接方法,所以做了转型。
		HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		//设置请求方法等信息
		connection.setRequestMethod("POST");
		//设置发送文件格式及编码
		connection.setRequestProperty("Content-Type","text/xml; charset=utf-8");
		//打开通信
		connection.setDoOutput(true);
		connection.setDoInput(true);
		String cityName="比尔吉沃特";
		//获取拼接好的xml字符串
		String xmlString = getXML(cityName);
		//获取流对象发送字节数组信息
		OutputStream outputStream = connection.getOutputStream();
		outputStream.write(xmlString.getBytes());
		//获取响应码
		int responseCode = connection.getResponseCode();
		//如果相应成功将数据取出来,输出到控制台,否则输出响应码
		if(responseCode==200){
			InputStream inputStream = connection.getInputStream();
			Scanner scanner= new Scanner(inputStream);
			while(scanner.hasNext()){
				System.out.println(scanner.nextLine());
			}
		}else{
			System.out.println("响应码为:"+responseCode);
		}
	}

运行程序获得返回结果:
在这里插入图片描述
5.通过4,我们可以看出两点。第一:手动拼接xml麻烦。第二:获取的信息对我们有用的部分其实是<return></return>里边的内容,我们要想法获取到。
待补充
6.CXF框架开发webservice,其实就是另一个框架。基础实现和ssm整合cxf待补
7.使用AXIS2进行webservie接口开发,就是另一个框架,感觉没有CXF好用。但是项目中使用了也学一下。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值