笔记:Jersey REST 传输格式

通常REST接口会以XML或JSON作为主要传输格式,同时 Jersey 也支持其他的数据格式,比如基本类型、文件、流等格式。

  1. 基本类型

    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));

    }

  1. 文件类型

    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());

    }

    }

  1. 字节流和字符流类型

    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();

      }

      }

      ?
      ?

?
?

时间: 2024-10-14 17:01:31

笔记:Jersey REST 传输格式的相关文章

笔记:Jersey REST 传输格式-JSON

JSON 类型已经成为Ajax技术中数据传输的实际标准,Jersey 提供了多种处理JSON数据的包和解析方式,下表展示了JSON包和解析方式: 解析方式\JSON支持包 MOXy JSON-P Jackson 基于POJO的JSON绑定 是 否 是 基于JAXB的JSON绑定 是 否 是 低级的(逐字的)JSON解析和处理 否 是 否 使用 MOXy 处理JSON MOXy 是 EclipseLink项目的一个模块,是使用JAXB和SDO作为XML绑定的技术基础,实现了JSR222标准(JAX

图解 TCP/IP 第六章 TCP与UDP 笔记6.1 传输层的作用

?图解?TCP/IP? 第六章?TCP与UDP? ?笔记6.1 传输层的作用 ? 传输层必须指出这个具体的程序,为了实现这一功能,使用端口号这样一种识别码.根据端口号,就可以识别在传输层上一层的应用程序所有进行处理的具体程序. ? 6.1.1 传输层定义 6.1.2 通信处理 ? 6.1.3 两种传输层协议 TCP和UDP TCP 是面向连接的.可靠的流协议.流就是指不间断的数据结构,你可以把它想象成排水管道中的水流. UDP 是不具有可靠性的数据包协议 .细微的处理会交给上层的应用去完成.在U

QT断点续传(原理:需要在HTTP请求的header中添加Rang节,告诉服务器从文件的那个位置开始传输.格式为bytes 开始传输的位置)

//功能:    根据一个URL地址将数据保存到指定路径下,支持断点续传//参数:    url            --需要访问的URL地址//         SavePath       --需要保存的路径//DownedSize 已经下载的大小// totalSize 文件总大小//返回值:  ture --成功 false --失败bool HttpGet::DownFile(const QUrl &url,const QString &SavePath,int DownedS

在同一个项目中灵活运用application/json 和application/x-www-form-urlencoded 两种传输格式(配合axios,同时配置loading)

'use strict' import axios from 'axios' // import qs from 'qs' import { Notification} from 'element-ui' //使用elementui的提示显示 import { Loading } from 'element-ui' import router from "../router"; let loading function startLoading() { loading = Loadin

Jersey支持json格式

官网上看得不太明白,好几种方法,有些要自动匹配,有些要写配置代码让jersey去识别json格式的数据. 在stack over flow上有个回答解决了困扰我的问题: http://stackoverflow.com/questions/29136404/severe-messagebodywriter-not-found-for-media-type-application-json-type-class 第一种方法: 加maven依赖: <dependency> <groupId&

Ajax中传输格式为XML

一: 1.优缺点 二:大纲 1.结构设计 三:程序 1.xml 1 <?xml version="1.0" encoding="utf-8"?> 2 <details> 3 <name>Andy Budd</name> 4 <website>http://andybudd.com/</website> 5 <email>[email protected]</email>

《TCP/IP详解卷2:实现》笔记--TCP:传输控制协议

传输控制协议,即TCP,是一种面向连接的传输协议,为两端的应用程序提供可靠的端到端数据流传输服务,它完全不同于 无连接的.提供不可靠数据传输服务的UDP协议. 下图描述了各TCP函数与其他内核函数之间的关系,带阴影的椭圆分别表示我们将要讨论的9个主要的TCP函数. 1.TCP的protosw结构 下图列出了TCPprotosw结构的成员变量,它定义了TCP协议与系统内其他协议之间的交互接口. 2.TCP的首部 tcphdr结构定义了tcp首部.下图给出了tcphdr结构的定义和TCP首部. 大多

R语言学习笔记001——读取csv格式数据

读取csv格式数据 数据来源是西南财经大学 司亚卿 老师的课程作业 方法一:read.csv()函数 1 file.choose() 2 read.csv("C:\\Users\\Administrator\\Desktop\\Astocks.csv", 3 head=T,sep=',',nrows = 5,stringsAsFactors = FALSE) 结果 file.choose():读入该文件,这样我们知道该文件的具体路径. file参数:        路径和文件名,win

本学习笔记TCP/IP传输协议

一个.通过网络发送数据,大致能够分为面向有连接与面向无连接两种类型: 1.面向无连接型包含以太网. IP.UDP等协议. 2. 面向有连接 型包含ATM.帧中继.TCP等 协议. 通过一张图了解一下: 面向有连接型 面向有连接型中,在发送数据之前,须要在收发主机之间连接一条通信线路 面向有连接型就好比人们寻常打电话,输入完对方电话号码拨出之后.仅仅有 对端拿起电话才干真正通话,通话结束后将电话机扣上就如同切断电源.因此在 面向有连接的方式下,必须在通信传输前后.专门进行建立和断开连接的处理. 假