原地址:http://blog.csdn.net/li575098618/article/details/47853263

Jersey 1.0 是一个开源的、可以用于生产环境的 JAX-RS(RESTful Web Services 的 Java API 规范,JSR-311)实现。通过 Jersey 可以很方便的使用 Java 来创建一个 RESTful Web Services。

一篇早期的技术文章——《在 Java 中实现 RESTful Web Services》,介绍了 RESTful,JAX-RS 以及 Jersey。它同样向你展示了怎样使用 Java 来写一个遵循 JAX-RS 标准的 RESTful Web Services。另一篇文章《在 Jersey 1.0 中为 RESTful Web Services 配置 JSON》说明了怎么通过 Jersey 1.0 来配置数据格式为 JSON(JavaScript 对象符号)。

在这篇文章中,你将学到怎么使用 Jersey 1.0.2 客户端 API 来创建基于 HTTP 的 RESTful Web Services。Jersey 1.0.2 客户端 API 是一个易于使用的,高层的的 Java API,可以帮助你编写任何基于 HTTP 的 RESTful Web Services。这个 API 构建于一个统一的接口规范,其中的一个关键就是 REST 原则。这个统一的接口规范意味着一个基于 REST 的应用程序不管它访问任何 URL,那些 URL 的接口都必须是一样的。 
Jersey 客户端 API 基础 
要开始使用 Jersey 客户端 API,你首先需要创建一个 com.sun.jersey.api.client.Client 类的实例。下面是最简单的方法:

import com.sun.jersey.api.client.Client;
Client client = Client.create();

Client 类是创建一个 RESTful Web Service 客户端的主要配置点。你可以使用它来配置不同的客户端属性和功能,并且指出使用哪个资源提供者。创建一个 Client 类的实例是一个比较昂贵的操作,所以尽量避免创建一些不需要的客户端实例。比较好的方式是尽可能地复用已经存在的实例。

当你创建完一个 Client 类的实例后,你可以开始使用它。无论如何,在发出请求前,你需要创建一个 WebResource 对象来封装客户端所需要的 Web 资源。例如,以下代码为一个完整地址为http://example.com/base 的 Web 资源创建了一个 WebResponse 对象:

import com.sun.jersey.api.client.WebResource;
WebResource webResource = c.resource("http://example.com/base");

通过使用 WebResource 对象来创建要发送到 Web 资源的请求,以及处理从 Web 资源返回的响应。例如,你可以使用 WebResource 对象来发送 HTTP GET、PUT、POST 以及 DELETE 请求。

GET 请求:使用 WebResource 类的 get() 方法来提交一个 HTTP GET请求到 Web 资源:

String s = webResource.get(String.class);

这表示如果 WebResource 对象的 URL 是 http://example.com/base,那么一个 HTTP GET 请求将会发送到地址为 http://example.com/base 的资源。如果你熟悉命令行下的 HTTP 工具 curl,那么你可以知道:

String s = webResource.get(String.class);

相应的 curl 命令如下

curl http://example.com/base

你还可以指定 get() 请求时的查询参数。例如,下面的代码在 get() 请求中指定了两个查询参数:

MultivaluedMap queryParams = new MultivaluedMapImpl();
queryParams.add("param1", "val1");
queryParams.add("param2", "val2");
String s = webResouce.queryParams(queryParams).get(String.class);

相应的 curl 命令如下:

curl http://example.com/base?param1=val1&param2=val2

你还可以指定响应所能接受的 MIME 类型。例如,下面的代码指定了响应的 MIME 类型只能为文本:

String s = webResource.accept("text/plain").get(String.class);

相应的 curl 命令如下:

curl -HAccept:text/plain http://example.com/base

另外,你还可以获取对应请求的 HTTP 状态码,例如下面这个例子展示获取一个请求所返回的文本实体与状态码:

ClientResponse response = webResource.accept("text/plain")
.get(ClientResponse.class);
int status = response.getStatus();
String textEntity = response.getEntity(String.class);

ClientResponse 对象代表了一个客户端收到的 HTTP 响应。

PUT 请求:使用 WebResource 类的 put() 方法来提交一个 HTTP PUT 请求到 Web 资源。例如下面的代码展示了请求发送一个文本实体 foo:bar 到指定的 Web 资源:

ClientResponse response = webResource.type("text/plain").put(ClientResponse.class, "foo:bar");

相应的 curl 命令如下:

curl -XPUT -HContent-type:text/plain --data "foo:bar" http://example.com/base

同样,你也可以在使用 put() 方法发送请求时指定查询参数,方法与使用 get() 方法时指定查询参数一样。在下面的例子中,把在之前 get() 方法示例中使用过的两个同样的查询参数指定到了一个 put() 请求中:

MultivaluedMap queryParams = new MultivaluedMapImpl();
queryParams.add("param1", "val1");
queryParams.add("param2", "val2");
ClientResponse response = webResource.queryParams(queryParams).put(ClientResponse.class, "foo:bar");

相应的 curl 命令如下:

curl -XPUT -HContent-type:text/plain --data "foo:bar" http://example.com/base?param1=val1&param2=val2

POST 请求:一个 POST 请求相当于一个 GET 请求和一个 PUT 请求的综合,也就意味着,你可以使用 POST 请求来发送一个实体到指定的 Web 资源并且接收另一个实体。使用 WebResource 类的 post() 方法来发送一个 HTTP POST 请求到指定的 Web 资源。下面的例子展示了发送一个带有查询参数以及进行了 URL 编码的表单数据的 POST 请求:

MultivaluedMap formData = new MultivaluedMapImpl();
formData.add("name1", "val1");
formData.add("name2", "val2");
ClientResponse response = webResource.type("application/x-www-form-urlencoded")
.post(ClientResponse.class, formData);

相应的 curl 命令如下:

curl -d name1=val1 -d name2=val2 http://example.com/base

DELETE 请求:使用 WebResource 类的 delete() 方法来发送珍上 HTTP DELETE 请求到指定的 Web 资源。例如,下面的例子展示删除一个 URI 为 http://example.com/base/user/123 资源:

ClientResponse response = webResource.path("user/123") .delete(ClientResponse.class);

相应的 curl 命令如下:

curl -XDELETE http://example.com/base/user/123

另外,WebResource.path() 方法可以在所有 HTTP 请求中使用,它可以让你给要请求的 Web 资源指定一个额外的路径。另一个 WebResouce 类的方法 header() 可以给你的请求添加 HTTP 头部信息。

配置 Jersey 客户端 
在发送请求前,你还需要配置 Jersey 客户端,这涉及到注册提供程序。另外你也可以添加过滤器 ,这是可选的操作。你可以查阅 Jersey 1.0.2 客户端 API 来得到所有可选操作的概览。

注册提供程序:在 JAX-RS 中,提供程序是指一个 JAX-RS 扩展的实现。一个提供程序类被一个 @Provier 注解所标注。Jersey 服务器实现了提供程序的基础结构。在实现 JAX-RS 时,Jersey 包含了标准的提供程序类。Jersey 客户端 API 重用了与 Jersey 服务器同样的提供程序基础结构。无论如何,你都必须显式的注册所有非标准的提供程序,因为在客户端不会自动进行类库路径的搜索。

要注册一个提供程序,你需要将提供程序的类添加到 ClientConfig 对象用来创建 Client 类的实例。ClientConfig 类定义了通用的属性名称、功能、属性、提供程序类,以及可以被 Client 对象使用的单例提供程序实例。例如下面的代码注册了一个供 Client 对象使用的 JSON 提供程序:

ClientConfig config = new DefaultClientConfig();
config.getClasses().add(JSONRootElementProvider.class);
Client client = Client.create(config);

注意 DefaultClientConfig 类的使用,它定义了默认的 Client 配置

添加过滤器:另外一个在配置 Client 过程中可选的操作是添加过滤器到 Client 实例。过滤器动态的拦截到一个资源类的请求和响应,并且可以修改请求或响应。Jersey 客户端 API 提供了一些工具类过滤器。其中之一是 LoggingFilter,它实现了一个日志记录过滤器。你可以使用一个日志记录过滤器来跟踪客户端与服务器之间的通信,这在调试的时候往往很有用。下面的代码展示了怎么添加一个日志记录过滤器到客户端:

import com.sun.jersey.api.client.filter.LoggingFilter
client.addFilter(new LoggingFilter());

一个基于 Jersey 客户端的示例 
Twitter: Twitter 是一个允许你与朋友、同事、家人或者其他人之间交换简短信息的服务。那些信息是用来回答“你在干什么”这个问题。下面是通过 Twitter 显示一些信息的例子: 
Twitter 提供了一个公开的 Twitter API ,你可以通过这个 API 来使用编程的方式发表或查看 Twitter 消息,或使用这个服务的其他功能。如果你要使用 Twitter API,有一件事你必须考虑到是Twitter的认证和安全机制和要求。 
*Twitter 认证与安全*:Twitter 使用基本的 HTTP 认证语法。这意味着如果你要通过 Twitter API 来存取 Twitter,你需要在你的请求中添加认证头。如果你需要更安全的通信,那么你同样可以使用 SSL(Secure Sockets Layer) 来与服务器进行通信。你只需要简单的依照下面的代码做即可:

ClientConfig config = new DefaultClientConfig();
SSLContext ctx = SSLContext.getInstance("SSL");
ctx.init(null, myTrustManager, null);
config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, new HTTPSProperties(hostnameVerifier, ctx));
Client client = Client.create(config);

创建 Client 和 WebResource 对象的代码

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource; private static final String BaseURI = "https://twitter.com";
private final WebResource wr; Client client = Client.create(config);
wr = client.resource(BaseURI);

配置客户端的代码

import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig; ClientConfig config = new DefaultClientConfig();
config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES, new HTTPSProperties(hv, ctx));
config.getClasses().add(JAXBContextResolver.class);

发出一个 GET 请求的代码

public List<StatusBean> getFriendsTimelineJson() {
return wr.path("statuses/friends_timeline.json")
.header(AUTHENTICATION_HEADER, authentication)
.accept(MediaType.APPLICATION_JSON_TYPE)
.get(new GenericType<List<StatusBean>>() {
});
}

通过 Jersey Http请求头,Http响应头,客户端 API 调用 REST 风格的 Web 服务的更多相关文章

  1. Jersey客户端API调用REST风格的Web服务

    Jersey 客户端 API 基础 jersey-1.14.jar 密码: cxug 要开始使用 Jersey 客户端 API,你首先需要创建一个 com.sun.jersey .api.client ...

  2. 通过Jersey客户端API调用REST风格的Web服务

    Jersey 客户端 API 基础 要开始使用 Jersey 客户端 API,你首先需要创建一个 com.sun.jersey .api.client.Client 类的实例.下面是最简单的方法: i ...

  3. Android系列之网络(二)----HTTP请求头与响应头

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  4. HTTP请求的基本概念 HTTP请求头和响应头的含义

    1,HTTP请求的基本概念    TCP/UPD/HTTP    *2,HTTP请求头和响应头的含义  请求头:  Accept: text/html,image/*(浏览器可以接收的类型)  Acc ...

  5. (二)----HTTP请求头与响应头

    一.HTTP头引入: 正确的设置HTTP头部信息有助于搜索引擎判断网页及提升网站访问速度.通常HTTP消息包括:客户机向服务器的请求消息和服务器向客户机的响应消 息.客户端向服务器发送一个请求,请求头 ...

  6. Android Http请求头与响应头的学习

    本节引言: 上节中我们对Android涉及的网络编程进行了了解,也学习了下Http的基本概念,而本节我们 要学习的是Http的请求头与响应头,当然,可以把也可以把这节看作文档,用到的时候来查查 即可! ...

  7. [面试没答上的问题1]http请求,请求头和响应头都有什么信息?

    最近在找工作,面试官问了一些问题自己并没有回答上,这里做一个小结. http请求,请求头和响应头都有什么信息? 页面和服务器交互最常见的方式就是ajax,ajax简单来说是浏览器发送请求到服务端,然后 ...

  8. HTTP请求头与响应头(转载)

    欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/400503 ...

  9. HTTP请求头和响应头的格式

    请求头: 请求头肯定带着客户端信息,比如host主机名,User-Agent用户代理信息,Cookie等等  响应头: 响应头带有服务端信息:Server服务器信息,Last-Modified最后修改 ...

随机推荐

  1. 11586 - Train Tracks

    Problem J: Train Tracks Andy loves his set of wooden trains and railroad tracks. Each day, Daddy has ...

  2. Fedora 17 下安装codeblocks

    Fedora 17 下安装codeblocks:        1.直接从yum源安装:        sudo yum install codeblocks        2.源码安装        ...

  3. Effective C++_笔记_条款02_尽量以const、enum、inline替换#define

    (整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 这个条款或许改为“宁可以编译器替换预处理器”比较好,因为或许#d ...

  4. JSP自定义标签——传统标签

    同JSP标签一样,自定义标签主要用于移除JSP页面中的Java代码,可以看到我们在JSP中其实是禁止使用Java脚本的,任何要想通过Java代码实现的功能都必须以标签形式来处理,可以使用JSP标签,J ...

  5. 奇怪的问题,InvalidateRect最后一个参数在XP下无效

    一直用的WIN2K系统,写的一个程序在本机正常,到XP系统的机器运行发现调整窗口大小时界面闪得厉害,程序比较大,而且这种闪烁还不好调试,因为单步调试没有闪烁效果,只能排除法找原因,最后以为找到原因了, ...

  6. 自绘ListBox的两种效果

    本文利用Listbox自绘实现了两种特殊效果(见图),左边的风格是自己突然灵感触发想到的,右边的风格来自"C++ Builder 研究"的一个帖子,老妖用BCB实现了,这里则用Delphi实现它. 演 ...

  7. 【IOS实例小计】UIImageView

    预备知识: UIImage 是一个专门存储图片数据的对象,默认兼容的图片格式是 PNG,可以通过文件.Quartz image对象或 image Data数据得到一个图片对象. UIImage相关功能 ...

  8. [置顶] window.open()你真的会了吗?

    一.window.open()支持环境: JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+ 二.基本语法: window.open(pageURL,name, ...

  9. javascript (十四) dom

    通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素. HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object M ...

  10. web前端优化手段

    web前端优化手段有很多,同种的优化方式或许在不同的网络协议会南辕北辙,下面就自己结合工作经验和学习总结的一些手段总结 1.合并文件减小请求数:sprite图片的合成.合并脚本与样式. 2.减小文件的 ...