原地址: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. 用spring-data-redis实现类似twitter的网站(转)

    1. spring-data-redis简介 封装了一下redis的客户端,使得使用起来更方便. 优点是把客户端连接放到一个连接池里,从而提高性能.还有就是可以不同的客户端之间实现切换,而不用改一行代 ...

  2. PHPCMS V9数据库配置文件database.php位置

    初次用PHPCMS V9的朋友可能找不到数据库配置文件,其实在官方的wiki中已经介绍了.那就是 caches\configs\database.php 文件. 初次用PHPCMS V9的朋友可能找不 ...

  3. perl eval

    eval 表达式: eval 块: eval 在第一种形式,通常称为一个字符串eval EXPR 返回值是被解析的和被执行的作为一个小小的Perl程序. 表达式的值(是它本身决定的在标量上下文环境)是 ...

  4. Storm流计算之项目篇(Storm+Kafka+HBase+Highcharts+JQuery,含3个完整实际项目)

    1.1.课程的背景 Storm是什么? 为什么学习Storm? Storm是Twitter开源的分布式实时大数据处理框架,被业界称为实时版Hadoop. 随着越来越多的场景对Hadoop的MapRed ...

  5. 基于visual Studio2013解决面试题之0707最小元素

     题目

  6. 2006 ACM Northwestern European Programming Contest C题(二分求最大)

    My birthday is coming up and traditionally I'm serving pie. Not just one pie, no, I have a numberN o ...

  7. javascript (十四) dom

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

  8. Please verify you invoked Maven from the correct directory

    解决办法: 在cmd中,把当前路径转换到一个含有pom文件的 项目路径下 再使用 类似下面的deploy就行 mvn deploy:deploy-file -DgroupId=com.taobao.n ...

  9. 卸载QTP

    卸载QTP11.5 1.首先需要卸载QTP11.5,点击exe文件,不点击重启 2.然后删除C:"Program Files"下的Mercury Interactive文件夹.(默 ...

  10. [Usaco2008 Feb]Meteor Shower流星雨

    去年偶们湖南遭受N年不遇到冰冻灾害,现在芙蓉哥哥则听说另一个骇人听闻的消息: 一场流星雨即将袭击整个霸中,由于流星体积过大,它们无法在撞击到地面前燃烧殆尽, 届时将会对它撞到的一切东西造成毁灭性的打击 ...