[CXF REST标准实战系列] 二、Spring4.0 整合 CXF3.0,实现测试接口
Writer:BYSocket(泥沙砖瓦浆木匠)
Reprint it anywhere u want.
文章Points:
1、介绍RESTful架构风格
2、Spring配置CXF
3、三层初设计,实现WebService接口层
4、撰写HTTPClient 客户端,并实现简单调用
介绍RESTful架构风格
REST是REST之父Roy Thomas创造的,当时提出来了REST的6个特点:客户端-服务器的、无状态的、可缓存的、统一接口、分层系统和按需编码。其具有跨语言和跨平台的优势。
REST是一种架构风格。其描述性的状态包括资源数据的内容和表达格式(XML,JSON等)。请求其中一个资源:方为一个指定性和描述性的URI,经由HTTP将资源的表达从服务器转移到客户端,或者相反方向。
REST不是一种技术,也不是一个标准或者协议,它拥有标准:HTTP+URI+XML(JSON),来实现其要求的架构风格。
泥瓦匠的记忆宫殿:“REST其实就像万能规则一样。如果你遵循它的规则的话,就能得她提供给你的资源数据。”
Spring配置CXF
泥瓦匠用的是Spring4.0.x和CXF3.0.x版本。有兄长说过让我用其他的轻量级的Web Service框架,我最后考虑了下还是用CXF。
1、第一步配置所需的依赖包jars
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> <version>3.0.3</version></dependency><dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>3.0.3</version></dependency><dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxrs</artifactId> <version>3.0.3</version></dependency> |
在以前2.x的CXF上,bug和配置上很复杂。3.0以后很方便,用了MAVEN后,就是直接拷贝下上面的代码放到pom.xml即可。
2、配置Spring文件
首先配置CXF所需的XSD地址,表死我们引用了这个结构定义。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
然后泥瓦匠用配置核心的配置。在<beans></beans>直接加入所需要的cxf配置。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
<bean id="regUser" class="com.xidian.wq.imaopay.controller.webservice.UserInfoController"></bean> <!-- CXF 拦截器 <ref bean="tokenInterceptor" /> <bean id="tokenInterceptor" class="com.xidian.wq.imaopay.interceptor.cxf.TokenInterceptor" /> --> <!-- address-请求路径 --> <jaxrs:server id="imaoPayService" address="/ipservice"> <!-- 输入拦截器设置 --> <jaxrs:inInterceptors> </jaxrs:inInterceptors> <!-- 输出拦截器设置 --> <jaxrs:outInterceptors> </jaxrs:outInterceptors> <!-- serviceBeans-暴露的WebService服务类 --> <jaxrs:serviceBeans> <ref bean="regUser" /> </jaxrs:serviceBeans> <!-- 支持的协议 --> <jaxrs:extensionMappings> <entry key="json" value="application/json" /> <entry key="xml" value="application/xml" /> </jaxrs:extensionMappings> <!-- 编码格式 --> <jaxrs:languageMappings> <entry key="en" value="en-gb"/> </jaxrs:languageMappings> </jaxrs:server> |
根据代码的备注,泥瓦匠想让大家记住几点重要性的点。
address=”/ipservice” 表示我们以后用此地址访问所提供的地址。
<jaxrs:serviceBeans><jaxrs:serviceBeans/> 之间加入我们要暴露出去的服务类。这里泥瓦匠以一个简单的注册类来提供。
jaxrs:extensionMappings 是表示我们需要支持的协议。
3、UserInfoController是我们需要完成的暴露服务类。下面泥瓦匠说一下初设计(这点请大家指点指点)。
三层初设计,实现WebService接口层
初设计:
按着原来的SpringMVC的三层架构,我这边把原来的Controller层转为暴露在出来的接口服务类。自然View层也就没了。
UserInfoController的代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@Path("/user")// 访问路径@Produces("*/*")public class UserInfoController{ @POST @Path("/doTest")// 访问路径 @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})// 响应内容 MIME 类型 public String doTest(String requestXml)//@QueryParam("regRequestXml") { System.out.println("服务端获取到客户端的报文如下:\n"+requestXml); /* 构造响应报文 */ String responseXml = "响应的报文内容";//构造报文 XML 格式的字符串 return responseXml; }} |
暴露的接口层,也可以用inteface类加实现类来完成。泥瓦匠觉得多此一举,兴许我大言不惭。
泥瓦匠总结如下:
@POST 表示HTTP的访问模式
@Path 表示访问路径
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 响应内容 MIME 类型
泥瓦匠还在上一篇写过了对报文的处理:JAXB xml与javaBean的转换。具体请查阅。
HTTPClient 客户端,并实现简单调用
“实践出真理。”拿出来遛一遛即可。泥瓦匠简单的用HTTPClient访问
核心代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
/** * 注册报文发送案例 */ private void doRegXml() throws Exception { /** 构造测试报文头对象 */ String randNum = RandomStringUtils.randomNumeric(8);//八位 String timeStr = TimeUtil.getTimeSimple(); DataBean dataBean = new DataBean(); dataBean.setBatch_no("N20150204"); dataBean.setData_type("000001"); dataBean.setVersion("v1.0"); dataBean.setUser_name("13957706713"); dataBean.setMsg_sign("未知"); dataBean.setRd_num(randNum); dataBean.setRd_time(timeStr); dataBean.setK_sign(TokenCheckUtil.getSignature(null, timeStr, randNum)); /** 构造测试报文体对象 */ RegBean regBean = new RegBean(); regBean.setReg_sn("REG20150204"); regBean.setUser_id(15); regBean.setReg_no("33"); regBean.setReg_way("pc"); regBean.setSet_time(TimeUtil.getTimeAll()); regBean.setRet_url("未知"); regBean.setRemarks("无备注"); RegBean regBean2 = new RegBean(); regBean2.setReg_sn("REG20150203"); regBean2.setUser_id(13); regBean2.setReg_no("44"); regBean2.setReg_way("mobile"); regBean2.setSet_time(TimeUtil.getTimeAll()); regBean2.setRet_url("未知"); regBean2.setRemarks("无备注"); List<RegBean> regBeans = new ArrayList<RegBean>(); regBeans.add(regBean); regBeans.add(regBean2); MsgRegBean msgRegBean = new MsgRegBean(); msgRegBean.setDataBean(dataBean); msgRegBean.setRegBeans(regBeans); String regRequestXml = JaxbObjectAndXmlUtil.object2Xml(msgRegBean);//构造报文 XML 格式的字符串 System.out.println("\n 请求报文XML: \n"+regRequestXml); /** 获取的Result报文,然后客户端处理业务。 */ String resultString = HttpUtil.doPost("http://localhost:8080/imaopay/pay/ipservice/user/doTest",regRequestXml); System.out.println("\n 获取的Result报文: \n"+resultString); } |
运行后,控制台打印出如下结果:
客户端打印如下:
![]()
服务端获取结果如下:
![]()
Writer:BYSocket(泥沙砖瓦浆木匠)
Reprint it anywhere u want.
[CXF REST标准实战系列] 二、Spring4.0 整合 CXF3.0,实现测试接口的更多相关文章
- [CXF REST标准实战系列] 二、Spring4.0 整合 CXF3.0,实现测试接口(转)
转自:[CXF REST标准实战系列] 二.Spring4.0 整合 CXF3.0,实现测试接口 文章Points: 1.介绍RESTful架构风格 2.Spring配置CXF 3.三层初设计,实现W ...
- [CXF REST标准实战系列] 一、JAXB xml与javaBean的转换(转)
转自:[CXF REST标准实战系列] 一.JAXB xml与javaBean的转换 文章Points: 1.不认识到犯错,然后得到永久的教训. 2.认识JAXB 3.代码实战 1.不认识到犯错,然后 ...
- [CXF REST标准实战系列] 一、JAXB xml与javaBean的转换
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章Points: 1.不认识到犯错,然后得到 ...
- WCF开发实战系列二:使用IIS发布WCF服务
WCF开发实战系列二:使用IIS发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇中,我们创建了一个简单的WCF服务,在测试的时候,我们使用VS200 ...
- shiro实战系列(二)之入门实战续
下面讲解基于实战系列一,所以相关的java文件获取pom.xml及其log4j文件同样适用于本次讲解. 一.Using Shiro Using Shiro 现在我们的 SecurityManager ...
- SQL Server 性能优化实战系列(二)
SQL Server datetime数据类型设计.优化误区 一.场景 在SQL Server 2005中,有一个表TestDatetime,其中Dates这个字段的数据类型是datetime,如果你 ...
- MP实战系列(二)之集成swagger
其实与spring+springmvc+mybatis集成swagger没什么区别,只是之前写的太不好了,所以这次决定详细写. 提到swagger不得不提rest,rest是一种架构风格,里面有对不同 ...
- ElasticSearch实战系列二: ElasticSearch的DSL语句使用教程---图文详解
前言 在上一篇中介绍了ElasticSearch集群和kinaba的安装教程,本篇文章就来讲解下 ElasticSearch的DSL语句使用. ElasticSearch DSL 介绍 Elastic ...
- SpringBoot基础实战系列(一)整合视图
SpringBoot整合freemarker 1.添加依赖:springboot基本上是无缝衔接,基本上只需要添加对应的依赖,不需要或者做很少量的配置即可 注:对于springboot项目的创建此处不 ...
随机推荐
- Python+Selenium 利用ID,XPath,tag name,link text,partial link text,class name,css,name定位元素
使用firefox浏览器,查看页面元素,我们以“百度网页”为示例 一.ID定位元素 利用find_element_by_id()方法来定位网页元素对象 ①.定位百度首页,输入框的元素 ②.编写示 ...
- MyBatis中<if test=" ">标签条件不起作用
问题产生? 今天在做Excel导出的时候,有个判断一个状态的字段,我的这个字段是int类型的,还有两个时间类型,我在判断的时候给的是Long类型的. 在测试的时候发现,不管怎么样都不执行if条件里面的 ...
- Python Day 8
阅读目录: 内容回顾 三种字符串 文件操作三步骤 基础的读 基础的写 with...open()语法 文件的操作模式 文件的操作编码问题 文件的复制 游标操作 ##内容回顾 类型转换 #1.数字类 ...
- Nexus安装、使用说明、问题总结
Nexus安装.使用说明.问题总结 1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在 ...
- Java WebService 简单实例使用JDK
原文地址:http://www.cnblogs.com/jasoncc/archive/2011/12/22/2296052.html 什么是WebServices? 它是一种构建应用程序的普 ...
- python for data analysis 2nd 读书笔记(一)
第一章相对简单,也么有什么需要记录的内容,主要用到的工具的简介及环境配置,粗略的过一下就行了.下面我们开始第二章的学习 CHAPTER 22.2Python Language Basics, IPyt ...
- Exp6 信息搜集与漏洞扫描——20164325王晓蕊
1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 2.1 各种搜索技巧的应用 2.1.1 Netcraft查询 Netcraft这个网站可以查询到特定网站的IP地址,以wei ...
- 虚拟机找不到/mnt/hgfs挂载目录——debian与 vmware
如果在安装好 VMware Tools 并在设置里面设定好共享目录之后仍然找不到 /mnt/hgfs 默认挂载目录,那么尝试以下步骤: 1. 确认VMware Tools 和共享目录设定已经完成: 2 ...
- W3C标准和规范
W3C标准万维网联盟标准. 万维网联盟(外语缩写:W3C)标准不是某一个标准,而是一系列标准的集合.网页主要由三部分组成:结构(Structure).表现(Presentation)和行为(Behav ...
- Codeforces Round #421 (Div. 2)
A: 题意:给你一本书共c页,第一天看v0页,第二天看v0+a,第二天看v0+2a以此类推,每天最多看v1页,但是后一天要重复看前一天的后l页. 代码: #include<stdio.h> ...