笔记:Jersey REST 传输格式-XML
XML类型是使用最广泛的数据类型,Jersey 对XML类型的数据处理,支持Java领域的两大标准,即JAXP(Java API for XML Processing,JSR-206)和JAXB(Java Architecture for XML Binding,JSR-222),JAXP标准包含了DOM、SAX和StAX 三种解析技术标准。
- DOM是面向文档解析的技术,要求将XML数据全部加载到内存,映射为树和结点模型以实现解析
- SAX是事件驱动的流解析技术,通过监听注册事件,触发回调方法以实现解析
- StAX是拉式流解析技术,拉式解析使得读取过程可以主动推进当前XML位置的指针而不是被动的获得解析中的XML数据。
JAXP定义了三种标准类型的输入接口Source(DOMSource、SAXSource、StreamSource)和输出接口Result(DOMResult、SAXResult和StreamResult),示例代码如下:
/**
* 使用 StAX 拉式流解析技术
*
* @param streamSource
* @return
*/
@POST
@Path("stream")
@Produces(MediaType.APPLICATION_XML)
@Consumes(MediaType.APPLICATION_XML)
public StreamSource getStreamSource(StreamSource streamSource) {
return streamSource;
}
/**
* 使用 SAX 事件驱动的流解析技术
*
* @param saxSource
* @return
*/
@POST
@Path("saxsource")
@Produces(MediaType.APPLICATION_XML)
@Consumes(MediaType.APPLICATION_XML)
public SAXSource getSAXSource(SAXSource saxSource) {
return saxSource;
}
/**
* 使用DOM面向文档解析技术
*
* @param domSource
* @return
*/
@POST
@Path("domsource")
@Produces(MediaType.APPLICATION_XML)
@Consumes(MediaType.APPLICATION_XML)
public DOMSource getSAXSource(DOMSource domSource) {
return domSource;
}
/**
* 使用DOM面向文档解析技术
*
* @param document
* @return
*/
@POST
@Path("doc")
@Produces(MediaType.APPLICATION_XML)
@Consumes(MediaType.APPLICATION_XML)
public Document getSAXSource(Document document) {
return document;
}
JAXP 的缺点是需要编码解析XML,则增加了开发成本,但对业务逻辑的实现并没有实质的贡献,JAXB只需要在POJO定义相关的注解,使其和XML的schema对应,无须对XML进行程序式解析,弥补了JAXP的这个缺点,JAXB通过序列化和反序列化实现了XML数据和POJO对象的自动转换过程,JAXB的注解位于javax.xml.bind.annotation 包,从性能来说 JAXB低于JAXP,但使用JAXB的开发效率很高,示例代码如下:
- POJO代码
@XmlRootElement
public class CreateParam implements Serializable
{private String name;
private String sex;
private TestEnum testEnum;
@XmlAttribute(name = "name")
public String getName() {
return name;
}
public
void
setName(String name) {this.name = name;
}
@XmlAttribute(name = "sex")
public String getSex() {
return sex;
}
public
void
setSex(String sex) {this.sex = sex;
}
@XmlAttribute(name = "testEnum")
public TestEnum getTestEnum() {
return testEnum;
}
public
void
setTestEnum(TestEnum testEnum) {this.testEnum = testEnum;
}
}
@XmlRootElement
public class DemoResult implements Serializable {
private boolean hasError;
private int returnCode;
private String message;
@XmlAttribute(name = "hasError")
public boolean isHasError() {
return hasError;
}
public void setHasError(boolean hasError) {
this.hasError = hasError;
}
@XmlAttribute(name = "returnCode")
public int getReturnCode() {
return returnCode;
}
public void setReturnCode(int returnCode) {
this.returnCode = returnCode;
}
@XmlAttribute(name = "message")
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
- REST服务代码
@POST
@Path("jaxb")
@Produces(MediaType.APPLICATION_XML)
@Consumes(MediaType.APPLICATION_XML)
public DemoResult getEntity(CreateParam createParam) {
DemoResult result = new
DemoResult();result.setHasError(false);
result.setMessage("创建 name=" + createParam.getName() + "\tsex=" + createParam.getSex()
+ "\tenum value=" + createParam.getTestEnum().getEnumValue()
+ "\tenum desc=" + createParam.getTestEnum().getEnumDesc());
System.out.println(createParam.getTestEnum() == TestEnum.Error);
return result;
}
- 单元测试代码
@Test
public void PostJaxbXMLTest() {
CreateParam createParam = new CreateParam();
createParam.setName("jaxbXml");
createParam.setSex("man男人");
createParam.setTestEnum(TestEnum.Error);
Invocation.Builder builder = target.path("demos").path("jaxb").request();
Response response = builder.post(Entity.entity(createParam, MediaType.APPLICATION_XML));
if (response.getStatus() == 200) {
DemoResult result = response.readEntity(DemoResult.class);
System.out.println("result hasError=" + result.isHasError() + "\tmessage=" + result.getMessage());
} else {
System.out.println("response status=" + response.getStatus() + "\tmessage=" + response.getStatusInfo());
}
}
示例中的POJO类,都定义为XML的属性(property)来组织的,POJO的字段也可以作为元素(element)组织,如果REST请求的传输数据量很大,并且无须和外系统对接的场景,建议使用属性来组织XML,这样可以极大的减少XML格式的数据包大小。
注意:Jersey默认设置了XMLConstants.FEATURE_SECURE_PROCESSING属性,当属性和元素过多是,会报"well-formedness error"的警告信息,可以通过设置 MessageProperties.XML_SECURITY_DISABLE 参数值来屏蔽,设置示例如下:
- REST服务设置
// 继承ResouceConfig类,并增加属性设置
public class RESTfulResourceConfig extends ResourceConfig {
public RESTfulResourceConfig() {
property(MessageProperties.XML_SECURITY_DISABLE, Boolean.TRUE);
}
}
- 客户端设置
ClientConfig clientConfig = new
ClientConfig();clientConfig.property(MessageProperties.XML_SECURITY_DISABLE, Boolean.TRUE);
Client c = ClientBuilder.newClient(clientConfig);
笔记:Jersey REST 传输格式-XML的更多相关文章
- 笔记:Jersey REST 传输格式
通常REST接口会以XML或JSON作为主要传输格式,同时 Jersey 也支持其他的数据格式,比如基本类型.文件.流等格式. 基本类型 Java的基本类型又叫原生类型,包括4种整数(byte.sho ...
- 笔记:Jersey REST 传输格式-JSON
JSON 类型已经成为Ajax技术中数据传输的实际标准,Jersey 提供了多种处理JSON数据的包和解析方式,下表展示了JSON包和解析方式: 解析方式\JSON支持包 MOXy JSON-P Ja ...
- 001-RESTful服务最佳实践-RestFul准则、HTTP动词表示含义、合理的资源命名、响应格式XML和JSON
一.概述 因为REST是一种架构风格而不是严格的标准,所以它可以灵活地实现.由于这种灵活性和结构自由度,对设计最佳实践也有很大的差异. API的方向是从应用程序开发人员的角度考虑设计选择. 幂等性 不 ...
- 图解 TCP/IP 第六章 TCP与UDP 笔记6.1 传输层的作用
图解 TCP/IP 第六章 TCP与UDP 笔记6.1 传输层的作用 传输层必须指出这个具体的程序,为了实现这一功能,使用端口号这样一种识别码.根据端口号,就可以识别在传输层上一层的应用程 ...
- [WEB API] CLIENT 指定请求及回应格式(XML/JSON)
[Web API] Client 指定请求及响应格式(xml/json) Web API 支持的格式请参考 http://www.asp.net/web-api/overview/formats-an ...
- QT断点续传(原理:需要在HTTP请求的header中添加Rang节,告诉服务器从文件的那个位置开始传输.格式为bytes 开始传输的位置)
//功能: 根据一个URL地址将数据保存到指定路径下,支持断点续传//参数: url --需要访问的URL地址// SavePath -- ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(八)RTP音视频传输解析层之MPA传输格式
一.MPEG RTP音频传输 相较H264的RTP传输格式,MPEGE音频传输格式则简单许多. 每一包MPEG音频RTP包都前缀一个4字节的Header,如下图(RFC2550) “MBZ”必须为0( ...
- 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——实现篇:(七)RTP音视频传输解析层之H264传输格式
一.H264传输封包格式的2个概念 (1)组包模式(Packetization Modes) RFC3984中定义了3种组包模式:单NALU模式(Single Nal Unit Mode).非交错模式 ...
- XML系列之--对电文格式XML的简单操作(三)
前两章介绍了关于Linq创建.解析SOAP格式的XML,在实际运用中,可能会对xml进行一些其它的操作,比如基础的增删该查,而操作对象首先需要获取对象,针对于DOM操作来说,Linq确实方便了不少,如 ...
随机推荐
- linux Nagios监控
监控目标 监控目标主机分为四个部分 硬件资源 操作系统 数据库 应用软件 监控目的: 进行服务器性能调整前,知道调整什么,系统瓶颈在什么地方 被一部分必须同时监控,内容包括吞吐量,反应时间,使用率等 ...
- 网络基础tcp/ip协议一
计算机网络: 硬件方面:通过线缆将网络设备和计算机连接起来 软件方面:操作系统,应用软件,应用程序通过通信线路互连 实现资源共享,信息传递 计算机网络的功能: 数据通信 资源共享 增加可靠性 提高系统 ...
- ORACLE关于段的HEADER_BLOCK的一点浅析
在学习段(segment).区间(extent)时,对段的HEADER_BLOCK有一些疑问,本文记录一下探究的实验过程以及相关总结,,如有不对的地方,敬请指出.以SCOTT.EMP表为例(下面测试环 ...
- linux系统/sbin/init执行过程
对于Linux的启动过程,之前一直都是研究到内核运行/sbin/init,启动第一个用户进程为止,因为这部分一直都是在内核态工作,所以对于学习内核还是有帮助的,当时/sbin/init之后的过程也需要 ...
- VxWorks镜像简介
VxWorks镜像可分为三类: 可加载型VxWorks镜像:存储在开发机上,运行在板上RAM中 基于ROM的VxWorks镜像:存储在板上ROM,运行在板上RAM中 ROM驻留的VxWor ...
- freemarker之include指令
freemarker之include指令 1.父页面ftl <html> <head> <meta http-equiv="content-type" ...
- Java并发 线程池
线程池技术就是事先创建一批线程,这批线程被放入到一个池子里,在没有请求到达服务端时候,这些线程都是处于待命状态,当请求到达时候,程序会从线程池里取出一个线程,这个线程处理到达的请求,请求处理完毕,该线 ...
- IOS开发之XCode学习008:UIViewController基础
此文学习来源为:http://study.163.com/course/introduction/1002858003.htm 红色框选部分用A代替,AppDelegate类在程序框架启动时,如果在i ...
- ArcGIS API for JavaScript 4.4 版本加载谷歌地图
ArcGIS API for JavaScript 4.X 版本升级后,API发生了很大的变化. 其中就支持了WebEarth展示,主要是通过 esri/views/SceneView 实现的. 在新 ...
- 《C#图解教程》 总览
初识本书是在知乎,许多网友推荐它作为 C# 入门书籍. 本书的最大特点是插图丰富,许多复杂的概念,一副插图就解释得通透明了. 本书另外一个隐藏特性是作者有着 C/C++ 经验,书中经常提到它们与 C# ...