![12f3735a9bdf2ee7e2d8984dc9cc9f74.png](https://i-blog.csdnimg.cn/blog_migrate/3946ab62242f7ffbdfe2f2bb956868f4.jpeg)
文章Points:
- 介绍RESTful架构风格
- Spring配置CXF
- 三层初设计,实现WebService接口层
- 撰写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
org.apache.cxf cxf-rt-frontend-jaxws 3.0.3 org.apache.cxf cxf-rt-transports-http 3.0.3 org.apache.cxf cxf-rt-frontend-jaxrs 3.0.3
在以前2.x的CXF上,bug和配置上很复杂。3.0以后很方便,用了MAVEN后,就是直接拷贝下上面的代码放到pom.xml即可。
2、配置Spring文件
首先配置CXF所需的XSD地址,表示我们引用了这个结构定义。
//...配置cxf 然后用配置核心的配置。在直接加入所需要的cxf配置。
根据代码的备注,想让大家记住几点重要性的点。
- address=”/ipservice” 表示我们以后用此地址访问所提供的地址。
- 之间加入我们要暴露出去的服务类。这里以一个简单的注册类来提供。
- jaxrs:extensionMappings 是表示我们需要支持的协议。
3、UserInfoController是我们需要完成的暴露服务类。下面说一下初设计(这点请大家指点指点)。
三层初设计,实现WebService接口层
初设计:
按着原来的SpringMVC的三层架构,我这边把原来的Controller层转为暴露在出来的接口服务类。自然View层也就没了。
UserInfoController的代码如下:@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("服务端获取到客户端的报文如下:"+requestXml); /* 构造响应报文 */ String responseXml = "响应的报文内容";//构造报文 XML 格式的字符串 return responseXml; }}
暴露的接口层,也可以用inteface类加实现类来完成。
总结如下:
@POST 表示HTTP的访问模式
@Path 表示访问路径
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 响应内容 MIME 类型
HTTPClient 客户端,并实现简单调用
“实践出真理。”拿出来遛一遛即可。
核心代码如下:/** * 注册报文发送案例 */ 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 regBeans = new ArrayList(); 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(" 请求报文XML: "+regRequestXml); /** 获取的Result报文,然后客户端处理业务。 */ String resultString = HttpUtil.doPost(" http://localhost:8080/imaopay/pay/ipservice/user/doTest",regRequestXml); System.out.println(" 获取的Result报文: "+resultString); }
运行后,控制台打印出如下结果:
客户端打印如下:
![0e302408946f8773f55b3a0da387dd50.png](https://i-blog.csdnimg.cn/blog_migrate/303d1dbec446cb257cc131608acff861.jpeg)
服务端获取结果如下:
![50cc9707a16f7f6c0d8a597233468d9a.png](https://i-blog.csdnimg.cn/blog_migrate/6fad3472a3853af41ebf38f383739260.jpeg)