笔记:Jersey REST 传输格式
通常REST接口会以XML或JSON作为主要传输格式,同时 Jersey 也支持其他的数据格式,比如基本类型、文件、流等格式。
- 基本类型
Java的基本类型又叫原生类型,包括4种整数(byte、short、int、long)、2种浮点类型(float、double)、Unicode编码的字符(char)和布尔类型(boolean),Jersey 支持全部的基本类型,还支持与之相关的引用类型,示例代码如下:
- REST 服务代码
@POST
@Path("b")
public String postBytes(final byte[] bs) {
for (final byte b : bs) {
System.out.print(Integer.toHexString(b) + " ");
}
return "byte[]:" + new String(bs);
}
- 单元测试
@Test
public void postBytesTest() {
final String message = "TEST STRING";
final Invocation.Builder request = target.path("demos").path("b").request();
final Response response = request.post(Entity.entity(message, MediaType.TEXT_PLAIN_TYPE), Response.class);
String result = response.readEntity(String.class);
System.out.println("result:" + result);
Assert.assertTrue("字符串不匹配", result.equals("byte[]:" + message));
}
- 文件类型
Jersey 支持传输 File 类型的数据,以方便客户端直接传递File类实例给服务端,文件类型的请求,默认使用的媒体类型是 Content-Type:text/html,示例代码如下:
- REST服务代码
@POST
@Path("file")
public String uploadFile(final File file) {
StringBuilder sb = new StringBuilder(1024000 * 5);
try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(file))) {
byte[] buff = new byte[102400];
int readCount;
String dir = System.getProperty("user.dir");
File outputFile = new File(dir + "\\updateFile");
try (BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(outputFile))) {
do {
readCount = bufferedInputStream.read(buff, 0, buff.length);
if (readCount > 0) {
bufferedOutputStream.write(buff, 0, readCount);
}
} while (readCount > 0);
}
return "ok";
} catch (Exception ex) {
ex.printStackTrace();
return "";
}
}
- 单元测试
@Test
public void PostFileTest() {
URL resource = getClass().getClassLoader().getResource("TortoiseGit-2.3.0.0-64bit.msi");
File file = new File(resource.getFile());
Invocation.Builder builder = target.path("demos").path("file").request();
Response response = builder.post(Entity.entity(file, MediaType.TEXT_HTML_TYPE));
if (response.getStatus() == 200) {
String result = response.readEntity(String.class);
System.out.println(result);
} else {
System.out.println("response status=" + response.getStatus() + "\tmessage=" + response.getStatusInfo());
}
}
- 字节流和字符流类型
Jersey 支持Java的两大读写模式,即字节流和字符流
- 字节流:
- REST服务代码
@POST
@Path("fileInputStream")
public String uploadFileByInputStream(final InputStream inputStream) {
StringBuilder sb = new StringBuilder(1024000 * 5);
try (BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream)) {
byte[] buff = new byte[102400];
int readCount;
String dir = System.getProperty("user.dir");
File outputFile = new File(dir + "\\updateFile");
try (BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(outputFile))) {
do {
readCount = bufferedInputStream.read(buff, 0, buff.length);
if (readCount > 0) {
bufferedOutputStream.write(buff, 0, readCount);
}
} while (readCount > 0);
}
return "ok";
} catch (Exception ex) {
ex.printStackTrace();
return "";
}
}
- 单元测试
@Test
public void PostFileByInputStreamTest() {
InputStream inputStream = null;
try {
inputStream = getClass().getClassLoader().getResource("TortoiseGit-2.3.0.0-64bit.msi").openStream();
Invocation.Builder builder = target.path("demos").path("fileInputStream").request();
Response response = builder.post(Entity.entity(inputStream, MediaType.TEXT_PLAIN_TYPE));
if (response.getStatus() == 200) {
String result = response.readEntity(String.class);
System.out.println(result);
} else {
System.out.println("response status=" + response.getStatus() + "\tmessage=" + response.getStatusInfo());
}
} catch (IOException e) {
e.printStackTrace();
}
}
- 字符流:
- REST服务代码
@POST
@Path("fileReader")
public String uploadFileByReader(final Reader reader) {
StringBuilder sb = new StringBuilder(1024000 * 5);
try (BufferedReader bufferedReader = new BufferedReader(reader)) {
byte[] buff = new byte[102400];
String readLine;
String dir = System.getProperty("user.dir");
File outputFile = new File(dir + "\\updateFile.xml");
try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(outputFile))) {
do {
readLine = bufferedReader.readLine();
if (readLine != null) {
bufferedWriter.write(readLine);
bufferedWriter.newLine();
}
} while (readLine != null);
}
return "ok";
} catch (Exception ex) {
ex.printStackTrace();
return "";
}
}
- 单元测试
@Test
public void PostFileByReaderTest() {
InputStream inputStream = null;
try {
inputStream = getClass().getClassLoader().getResource("POM.xml").openStream();
Invocation.Builder builder = target.path("demos").path("fileReader").request();
Response response = builder.post(Entity.entity(inputStream, MediaType.TEXT_PLAIN_TYPE));
String result = response.readEntity(String.class);
System.out.println(result);
} catch (IOException e) {
e.printStackTrace();
}
}
笔记:Jersey REST 传输格式的更多相关文章
- 笔记:Jersey REST 传输格式-JSON
JSON 类型已经成为Ajax技术中数据传输的实际标准,Jersey 提供了多种处理JSON数据的包和解析方式,下表展示了JSON包和解析方式: 解析方式\JSON支持包 MOXy JSON-P Ja ...
- 笔记:Jersey REST 传输格式-XML
XML类型是使用最广泛的数据类型,Jersey 对XML类型的数据处理,支持Java领域的两大标准,即JAXP(Java API for XML Processing,JSR-206)和JAXB(Ja ...
- 图解 TCP/IP 第六章 TCP与UDP 笔记6.1 传输层的作用
图解 TCP/IP 第六章 TCP与UDP 笔记6.1 传输层的作用 传输层必须指出这个具体的程序,为了实现这一功能,使用端口号这样一种识别码.根据端口号,就可以识别在传输层上一层的应用程 ...
- 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).非交错模式 ...
- 在同一个项目中灵活运用application/json 和application/x-www-form-urlencoded 两种传输格式(配合axios,同时配置loading)
'use strict' import axios from 'axios' // import qs from 'qs' import { Notification} from 'element-u ...
- Fortran学习笔记:01 基本格式与变量声明
Fortran学习笔记目录 01 基本格式与变量声明 格式 固定格式(Fixed Format):Fortran77 程序需要满足一种特定的格式要求,具体形式参考教材 自由格式(Free Format ...
- HTTP的FormData和Payload的传输格式
FormData和Payload是浏览器传输给接口的两种格式,这两种方式浏览器是通过Content-Type来进行区分的(了解Content-Type),如果是 application/x-www-f ...
随机推荐
- Python基础学习参考(七):字典和集合
一.字典 字典跟列表一样是一组数据的集合.它的特点是什么呢? 特点一:字典具有键(key)和值(value),其中键必须是唯一的,不可重复的,即键必须可以哈希的.对于值没有要求. 特点二:字典是无序的 ...
- 【Android测试工具】Android抓包解析全过程
需求原因 在android开发中,遇到socket编程,无法从log日志中查看到与之通讯的socket发送和返回的数据包是什么,这里介绍一个工具,tcpdump工具和wireshark工具查看抓到的内 ...
- dojo省份地市级联之省份封装类(一)
省份封装类 Province.java /** * 省份封装类 */ package com.you.model; import java.io.Serializable; /** * @author ...
- STM32F4 输入输出(GPIO)模式理解
stm32的GPIO的配置模式有好几种,包括: 1. 模拟输入: 2. 浮空输入: 3. 上拉输入: 4. 下拉输入: 5. 开漏输出: 6. 推挽输出: 7. 复用开漏输出: 8. 复用推挽输出 ...
- JSP标签c:forEach报错(二)
1.今天,我在用c标签写一些样例,结果出现一些错误,写下作为记录 具体错误如下: 三月 31, 2014 9:46:28 下午 org.apache.catalina.core.StandardWra ...
- 【mongodb系统学习之八】mongodb shell常用操作
八.mongodb shell常用基础操作(每个语句后可以加分号,也可以不加,看情况定(有的工具中可以不加),最好是加): 1).进入shell操作界面:mongo,上边已有演示: 2).查看当前使 ...
- 三级级联查询省份名称和编码(保证名称不重复)的SQL语句
三级级联查询省份名称和编码(保证名称不重复)的SQL语句 1.省份.地市和县级数据库表 2.SQL语句 SELECT DISTINCT t.`province_name`,t.`province_co ...
- 芝麻HTTP:Python爬虫进阶之Scrapy框架安装配置
初级的爬虫我们利用urllib和urllib2库以及正则表达式就可以完成了,不过还有更加强大的工具,爬虫框架Scrapy,这安装过程也是煞费苦心哪,在此整理如下. Windows 平台: 我的系统是 ...
- Java并发 线程池
线程池技术就是事先创建一批线程,这批线程被放入到一个池子里,在没有请求到达服务端时候,这些线程都是处于待命状态,当请求到达时候,程序会从线程池里取出一个线程,这个线程处理到达的请求,请求处理完毕,该线 ...
- 【原】Spring源码浅析系列-导入源码到Eclipse
用了Spring几年,平时也断断续续在项目里看过一些源码,大多都是比较模糊的,因为一旦从一个地方进去就找不到方向了,只能知道它大概是做了什么事能达到这个功能或者效果,至于细节一般没有太深入去研究.后来 ...