导航:首页 > 编程语言 > jersey解析json

jersey解析json

发布时间:2023-08-07 20:27:51

❶ 如何结合REST和jsON构建API

转载
构建web可访问应用编程接口很简单,但使之良好工作,而且不间断却不简单,Les Hazlewood在2013年javaOne大会上如此说,他是Stormpath的首席技术官。Hazlewood在大会上展示了通过JAX-RS和Jersey构建美好的REST+JSON API的最佳实践。
“表面看来,良好的REST API很简单,即使后端很复杂,” Hazlewood在一次采访说到。一个API关注一系列的东西,以及如何表现个人的东西。减少API集合,搜索所有书籍和出版刊物,你会发现一个简洁的解决方案,它很直观,且不是太复杂。
在本文中,Hazlewood深入打探讨了API最佳实践、REST API和JSON的优缺点等等。
使用REST API时,什么是开发人员需要探索的?
Les Hazlewood:REST作为架构式构建存在于HTTP的最顶层。你交换数据的方式、你创建、读取、更新和删除数据的语义都建立在HTTP规范之内。REST是用于编纂当交换跨分离机器创建读取-删除时的工作环境如何。
这就是REST,编纂这些跨分离机器的行为发生的方式。因为它依赖于HTTP,我可能有一台Linux机器,它可以与Windows机器时行对话,也可以与Mac机对话。它并不是平台或厂商特定的。因为HTTP无处不在,所以REST就无处不在。所有语言(Python、PHP、Java和C#)都可以与REST一起工作。
REST简化了所有方面。所有人都以为他们了解了HTTP。这正是你的浏览器所讲的东西。他们知道HTTP协议、知道GIT、知道POST,因为他们多年以来一直在填写web表单。所以因为REST只使用HTTP,开发人员就认为它很简单,但是现在REST服务越来越多,而不是XML,它融汇的SOAP。
使用REST的难点在哪?
Hazlewood::这正是我要做的演讲原因。REST是架构样式,但是使用它的方法论还没有正式的标准和规范。用样式来解释一下。我认为它的运行方式可能会与你以为稍微有点不同。因为它不是一个机器可以复制的规范,这里掺入了人为的因素。把东西变得简单易用的漏洞往往都不简单。REST和JOSN很简单。HTTP很简单。但要确保使用两者解决问题时,要直观,而不是随处都可编码化。
你推荐JSON和REST一起使用的其它原因还有什么?
Hazlewood:REST和JSON提供了与人友好的数据表述方法;数据不再像XML那样拥挤;你的肉眼就可以很容易看到。这一直都是广泛采用JSON的原因。
JSON是语法规范。它只是定义了基本的字符串、数字、空值、非空值。它允许你以一种简单的模式表述复杂的事情,而且以最小的元数据量。它如此的篇章,可以用于许多不同的环境中。机器很容易对其进行解析。人们也很容易阅读。
JavaScript是世界上一个占有重要位置的编程语言。即使主要的应用是由Java、Python或C#构建的,比重也很高,如果你有一个网页,或一个可视的用户界面,那么就会涉及到一些JavaScript。JSON与JavaScript兼容。所有具备JavaScript编程经验的人都会发现他们很容易就会了解JSON。如果你已经使用了JavaScript,那就能很轻松地与API集成。如果API返回给JSON,而且你已经编写的JavaScript,那么你的编程语言就已经知道如何与返回给服务器的数据进行交互。JSON使用JavaScript进行数据交换,而不只是编写软件,这在当前已经很流行了,
什么时候使用JSON正确,什么时候错误?
Hazlewood:显然,XML在结构化表述数据上更好。XML文档中包含更多的信息,类型在XML文档中表述会更有效。XML非常适合数据交换,但易用性方面却使用开发者犹豫了。JSON用肉眼就可以检查。XML在设计上更复杂。JSON是非常简单的语法。谈到语言设计,JSON只构建了一小部分的核心元素,而且一切都源于这一小部分元素。因为它的简单性,它很容易操作,也很容易理解。与XML相比,JSON并不是很适合机器消化信息。从这点来看,XML就会做的更好。

❷ 如何在java REST API中用GZip和Jersey压缩相应

有许多情景当你的REST api提供的相应是非常长的,并且我们都知道传递速度和贷款在移动设备/网络上是多重要。当开发支持REST apis的移动app的时候,我认为首要的性能最优化的点就是需要解决。猜猜是什么?因为响应式文本,因此我们能压缩这些文本。而且随着当前的只能手机和平板的能力,在客户端解压文本应该不是个大问题...因此在这篇文章中,如果你使用java的Jersey构建它,我将介绍你怎么能有选择性的压缩REST API响应,这个Jersey事JAX-RS的映射实现(还有更多)...

1.Jersey过滤器和拦截器

啊,感谢Jersey的强大的过滤器和拦截器特性,这个实现是相当容易的。然后过滤器是主要打算来维护像HTTP headers,URIs和/或HTTP methods的request和response的参数,拦截器是维护实体,通过维护实体的输入/输出流。

但是对于压缩将使用一个GZip WriterInterceptor,一个写拦截器被用于这种情况,在那个类里,实体被写到"wire",当在这种情况中时,它在服务器这边,这就意味着输出一个响应实体。

1.1GZip Writer Interceptor

那让我们来看看我们的GZip Writer Interceptor吧:

GZip Writer Interceptor

package org.codingpedia.demo.rest.interceptors;

import java.io.IOException;

import java.io.OutputStream;

import java.util.zip.GZIPOutputStream;

import javax.ws.rs.WebApplicationException;

import javax.ws.rs.core.MultivaluedMap;

import javax.ws.rs.ext.WriterInterceptor;

import javax.ws.rs.ext.WriterInterceptorContext;

@Provider

@Compress

public class GZIPWriterInterceptor implements WriterInterceptor {

@Override

public void aroundWriteTo(WriterInterceptorContext context)

throws IOException, WebApplicationException {

MultivaluedMap<String,Object> headers = context.getHeaders();

headers.add("Content-Encoding", "gzip");

final OutputStream outputStream = context.getOutputStream();

context.setOutputStream(new GZIPOutputStream(outputStream));

context.proceed();

}

}

注意:

它实现了WriterInterceptor,这是一个写拦截器的消息体的接口,这个接口包装调用javax.ws.rs.ext.MessageBodyWriter.writeTo

供应商实现WriterInterceptor协议必须要么以编程方式注册进一个JAX-RS运行环境,要么必须用@Provider注解来注解在一个提供商扫描语句期间自动的被JAX-RS运行环境发现。

@Compress是绑定注解的名称,在接下来的段落中我们将更详细的讨论它

“拦截器从WriterInterceptorContext中获得一个输出流并且设置一个新的用原始的GZIP包装器包装的输出流。在所有的拦截器被执行以后,输出流最终设置WriterInterceptorContext将用于序列化实体。在上面的例子中,实体字节将被写到GZIPOutputStream中,这个类将压缩流数据,然后把他们写到原始输出流。原始流总是把数据写到wire中。当拦截器被用在服务器上时,原始输出流会把数据写到底层服务器容器的流中,然后发送响应给客户端。”

“重载方法aroundWriteTo()获取WriterInterceptorContextz作为参数。这个上下文包括请求头参数getters和setters,请求属性,实体,实体流和其它属性;当你压缩你的响应时,你应当设置'Content-Encoding'头位gzip”

1.2 压缩注解

过滤器和拦截器能被绑定名字。名称绑定是一种概念,这种概念就是允许告诉一个JAX-RS的运行时,一个只为特定资源方法的特定的过滤器或者拦截器将被执行。当一个过滤器或者拦截器只对一些特定的资源方法限制,那我们就认为它是名称绑定。过滤器和拦截器没有这样的限制就被称作global。在我们的例子中我们已经构建了@Compress注解:

Compress annotation

package org.codingpedia.demo.rest.interceptors;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import javax.ws.rs.NameBinding;

//@Compress annotation is the name binding annotation

@NameBinding

@Retention(RetentionPolicy.RUNTIME)

public @interface Compress {}

而且用它来标记在资源上的方法,这个方法应该是被压缩的(eg:当GET-ing的时候,所有的博客用PodcastsResource)

@Compress annotation在资源方法上的使用

@Component

@Path("/podcasts")

public class PodcastsResource {

@Autowired

private PodcastService podcastService;

...........................

/*

* *********************************** READ ***********************************

*/

/**

* Returns all resources (podcasts) from the database

*

* @return

* @throws IOException

* @throws JsonMappingException

* @throws JsonGenerationException

* @throws AppException

*/

@GET

@Compress

@Proces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })

public List<Podcast> getPodcasts(

@QueryParam("orderByInsertionDate") String orderByInsertionDate,

@QueryParam("numberDaysToLookBack") Integer numberDaysToLookBack)

throws IOException,AppException {

List<Podcast> podcasts = podcastService.getPodcasts(

orderByInsertionDate, numberDaysToLookBack);

return podcasts;

}

...........................

}

2.测试

2.1SOAPui

好了,如果你正在用SOAPui测试,你能使用下面的请求违反PodcastsResource

Reqest:

请求例子:

GET http://localhost:8888/demo-rest-jersey-spring/podcasts/?orderByInsertionDate=DESC HTTP/1.1

Accept-Encoding: gzip,deflate

Accept: application/json, application/xml

Host: localhost:8888

Connection: Keep-Alive

User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

Response:

被压缩的json响应,通过SOAPui自动的解压缩

HTTP/1.1 200 OK

Content-Type: application/json

Content-Encoding: gzip

Content-Length: 409

Server: Jetty(9.0.7.v20131107)

[

{

"id": 2,

"title": "Quarks & Co - zum Mitnehmen",

"linkOnPodcastpedia": "http://www.podcastpedia.org/quarks",

"feed": "http://podcast.wdr.de/quarks.xml",

"description": "Quarks & Co: Das Wissenschaftsmagazin",

"insertionDate": "2014-10-29T10:46:13.00+0100"

},

{

"id": 1,

"title": "- The Naked Scientists Podcast - Stripping Down Science",

"linkOnPodcastpedia": "http://www.podcastpedia.org/podcasts/792/-The-Naked-Scientists-Podcast-Stripping-Down-Science",

"feed": "feed_placeholder",

"description": "The Naked Scientists flagship science show brings you a lighthearted look at the latest scientific breakthroughs, interviews with the world top scientists, answers to your science questions and science experiments to try at home.",

"insertionDate": "2014-10-29T10:46:02.00+0100"

}

]

SOAPui接受Content-type:gzip头,我们在GZIPWriterIntercepter中添加了并且自动的解压了响应并且用人眼可读的方式展示出来。

好了,就这些了。你已经了解了Jersey如何让它直接压缩REST api响应了。

❸ 各位大侠,jersey rest 里面get方法@Proces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }

没有json数据类型的解析器,你引入jersey-json这个包试试

❹ java微服务架构有哪些

String boot 微型架构首选面xml配置一路使用默认的话你只需要写核心逻辑,导出jar包就可以直接放在服务器上用

❺ json中的date类型怎么在js中判断出来

JSON是一种数据格式抄,和JS对象虽然语法类似,但是还是有根本区别的。
JSON格式在传输时只能传输一些基本数据类型,如String、Number、Boolean。因此我想你说的date类型只是JSON数据中的一个字符串,例如:
var json = {

date : '2013-02-26 10:50:22'
}

你可以通过一个正则表达式来判断是否为日期格式,如:
var reg = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/;
var isDate = reg.test(json.date);

alert(isDate);

阅读全文

与jersey解析json相关的资料

热点内容
linux硬盘检测 浏览:431
如何用路由器降低网络延迟 浏览:601
aix分区root密码 浏览:439
运动鞋买鞋上什么app 浏览:904
NSA工具下载 浏览:918
函数代码在哪个文件夹 浏览:213
微信应用怎么代码添加快捷方式 浏览:371
用数据说话是最有力的什么 浏览:27
图片文件被锁定无法打开 浏览:768
wr886nv2升级 浏览:490
移动硬盘视频文件无法删除 浏览:417
如何查看网络监控 浏览:132
打印机如何连接到网络打印机 浏览:181
vmlinux安装tools 浏览:768
波形文件转mp3 浏览:803
linux查看网络 浏览:163
如何从cad软件里打印命令文件 浏览:247
clover780ti黑苹果 浏览:928
丙烷数据表哪里有 浏览:72
一直生成photo文件夹 浏览:14

友情链接