Jersey 客户端 API 基础

jersey-1.14.jar 密码: cxug

要开始使用 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 类的实例后,你可以开始使用它。无论如何,在发出请求前,你需要创建一个 Web Resource 对象来封装客户端所需要的 Web 资源。

Web 资源创建了一个 WebResponse 对象:

import com.sun.jersey .api.client.WebResource;
Web Resource 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 的资源。

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

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

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

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

你还可以获取对应请求的 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");    

同样,你也可以在使用 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");

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

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

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

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

另外如果表单提交的话,需要new Form来作为参数提交。

一个基于 Jersey 客户端的示例

 import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.rimi.medical.common.domain.ResultPojo;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.core.util.MultivaluedMapImpl; import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map; /**
* JerseyAPi客户端
* Created by libt on 2015/01/30.
*/
public class JerseyClientUtil { private static final String BIGDATA_API_URL = ReadSettingProperties.getValue("bigdata_api_url"); /**
* post方法
*
* @param method 方法名
* @param param 参数
* @return 返回值
*/
public static ResultPojo postMethod(String method, String param) {
ResultPojo resultPojo = new ResultPojo();
ClientResponse response = null;
try {
Client client = Client.create();
WebResource resource = client.resource(BIGDATA_API_URL + method);
response = resource.type(MediaType.APPLICATION_JSON_TYPE).post(ClientResponse.class, param);
int status = response.getStatus();
String data = response.getEntity(String.class);
if (status == 200) {
JSONObject jsonObject = JSON.parseObject(data);
resultPojo.setStatus(jsonObject.getInteger("status"));
resultPojo.setData(data);
} else {
resultPojo.setStatus(response.getStatus());
resultPojo.setData(data);
}
} catch (Exception e) {
resultPojo.setStatus(500);//服务器异常
resultPojo.setErrorMsg(e.getMessage());
} finally {
if (response != null) {
response.close();
}
}
return resultPojo;
} /**
* get方法
* 例如:consultation/recommend?startDate=201412030253&endDate=201412020253
* @param method 方法名
* @param param 参数
* @return 返回值
*/
public static ResultPojo getMethod(String method, String param) {
ResultPojo resultPojo = new ResultPojo();
ClientResponse response = null;
try {
Client client = Client.create();
WebResource resource = client.resource(BIGDATA_API_URL + method);
response = resource.queryParams(parseJSON2Map(param)).accept(MediaType.APPLICATION_JSON_TYPE).get(ClientResponse.class);
int status = response.getStatus();
String data = response.getEntity(String.class);
if (status == 200) {
JSONObject jsonObject = JSON.parseObject(data);
resultPojo.setStatus(jsonObject.getInteger("status"));
resultPojo.setData(data);
} else {
resultPojo.setStatus(response.getStatus());
resultPojo.setData(response.getEntity(String.class));
}
} catch (Exception e) {
e.printStackTrace();
resultPojo.setStatus(500);//服务器异常
resultPojo.setErrorMsg(e.getMessage());
} finally {
if (response != null) {
response.close();
}
}
return resultPojo;
} /**
* get方法
* 例如:consultation/recommend/A1000037B04B8C
* @param method 方法名
* @param param 参数
* @return 返回值
*/
public static ResultPojo getMethodOnly(String method, String param) {
ResultPojo resultPojo = new ResultPojo();
ClientResponse response = null;
try {
Client client = Client.create();
WebResource resource = client.resource(BIGDATA_API_URL + method + param);
response = resource.accept(MediaType.APPLICATION_JSON_TYPE).get(ClientResponse.class);
int status = response.getStatus();
String data = response.getEntity(String.class);
if (status == 200) {
JSONObject jsonObject = JSON.parseObject(data);
resultPojo.setStatus(jsonObject.getInteger("status"));
resultPojo.setData(data);
} else {
resultPojo.setStatus(response.getStatus());
resultPojo.setData(response.getEntity(String.class));
}
} catch (Exception e) {
e.printStackTrace();
resultPojo.setStatus(500);//服务器异常
resultPojo.setErrorMsg(e.getMessage());
} finally {
if (response != null) {
response.close();
}
}
return resultPojo;
} public static MultivaluedMap parseJSON2Map(String jsonStr) {
MultivaluedMap queryParams = new MultivaluedMapImpl();
//最外层解析
JSONObject json = JSON.parseObject(jsonStr);
for (Map.Entry<String, Object> entry : json.entrySet()) {
Object v = entry.getValue();
//如果内层还是数组的话,继续解析
if (v instanceof JSONArray) {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Iterator<Object> it = ((JSONArray) v).iterator();
while (it.hasNext()) {
JSONObject json2 = (JSONObject) it.next();
list.add(parseJSON2Map(json2.toJSONString()));
}
queryParams.add(entry.getKey(), list);
} else {
queryParams.add(entry.getKey(), v);
}
}
return queryParams;
} public static void main(String[] args) { // ResultPojo resultPojo = postMethod("bfr/bfr_choices", "{\"userid\":\"00004\",\"createTime\":\"2014-09-23 16:19:23\",\"bmiScore\":\"80\",\"imageNum\":\"01\",\"type\":\"0\",\" info \":\"个人身体质量分析正常\"}");
ResultPojo resultPojo = getMethod("recommendInfo/query", "{\"endDate\":\"201412020253\",\"startDate\":\"201410010253\"}");
// ResultPojo resultPojo = getMethodOnly("consultation/recommend/", "A1000037B04B8C");
System.out.println(resultPojo.getStatus());
System.out.println(resultPojo.getErrorMsg()); }
}

Jersey客户端API调用REST风格的Web服务的更多相关文章

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

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

  2. 通过 Jersey Http请求头,Http响应头,客户端 API 调用 REST 风格的 Web 服务

    原地址:http://blog.csdn.net/li575098618/article/details/47853263 Jersey 1.0 是一个开源的.可以用于生产环境的 JAX-RS(RES ...

  3. RESTful风格的Web服务框架:Swagger

    Swagger与SpringMVC项目整合 为了方便的管理项目中API接口,在网上找了好多关于API接口管理的资料,感觉目前最流行的莫过于Swagger了,功能强大,UI界面漂亮,并且支持在线测试等等 ...

  4. 记录一个调试REST风格的web服务的client

    coogle浏览器的advanced rest client很好用,记录一下,脑子不好,容易忘,,可以在chrome 的网上应用店添加 Rest client是用来调试REST风格的Web服务,接收P ...

  5. JAVA客户端API调用memcached两种方式

    1. memcached client for java客户端API:memcached client for java 引入jar包:java-memcached-2.6.2.jar package ...

  6. Zookeeper 客户端API调用示例(基本使用,增删改查znode数据,监听znode,其它案例,其它网络参考资料)

    9.1 基本使用 org.apache.zookeeper.Zookeeper是客户端入口主类,负责建立与server的会话 它提供以下几类主要方法  : 功能 描述 create 在本地目录树中创建 ...

  7. Linux:服务器/客户端API调用错误检查

    昨天和今天上午,我分别实现简单的服务器和客户端,运行之后表示没问题,一切正常.但是这还是有问题的,最大的一个就是没有错误检查.现在我们来加上错误检查: 服务器的代码: #include <std ...

  8. 初探.NET CORE WEB API(RESTful风格)

    前面有4篇系列博客 (一)Asp.net web api中的坑-[找不到与请求 URI匹配的 HTTP 资源] (二)Asp.net web api中的坑-[http get请求中的参数] (三)As ...

  9. Rest风格WEB服务(Rest Style Web Service)的真相

    http://blog.csdn.net/jia20003/article/details/8365585 Rest风格WEB服务(Rest Style Web Service)的真相 分类: J2E ...

随机推荐

  1. vsftp 虚拟用户

    首先安装vsftp db-4wiki mkdir -p /opt/ftp 创建用户 sudo useradd virtual -d /opt/ftp -s /bin/false sudo chown ...

  2. HDU 1525 Euclid's Game

    题目大意: 题目给出了两个正数a.b 每次操作,大的数减掉小的数的整数倍.一个数变为0 的时候结束. 谁先先把其中一个数减为0的获胜.问谁可以赢.Stan是先手. 题目思路: 无论a,b的值为多少,局 ...

  3. OC 调用JS 代码 处理HTML5 实战

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; ...

  4. 数据库还原失败System.Data.SqlClient.SqlError: 无法执行 BACKUP LOG,因为当前没有数据库备份

    结尾日志的问题 还原选择中去掉结尾日志就可以了 转载自:http://blog.csdn.net/aojiancc2/article/details/46316451

  5. gulp4个基础API

    Gulp.src(globs[, options]) 此接口会匹配工作目录下指定规则的文件并返回提供给下一个插件管道使用.其中globs就是匹配格式,options是一些额外参数. gulp.src( ...

  6. NPM使用介绍

    NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用 允许用户NPM服务器下载并安装别 ...

  7. 关于 HSSF 和 XSSF 功能的开发者入门指南 (Apache POI 操作 Excel)

    关于 HSSF 和 XSSF 功能的开发者入门指南 笔者深夜无眠,特此对本文翻译一部分,未完成部分待后续更新 本文源文地址 意欲使用 HSSF 和 XSSF 功能快熟读写电子表格?那本文就是为你而写的 ...

  8. SPFA算法与dijkstra算法求单源最短路径的比较

    SPFA是运用队列,把所有的点遍历到没有能更新的,点可以重复入队 如题http://www.cnblogs.com/Annetree/p/5682306.html dijkstra是每次找出离源点最近 ...

  9. Spring Security(12)——Remember-Me功能

    目录 1.1     概述 1.2     基于简单加密token的方法 1.3     基于持久化token的方法 1.4     Remember-Me相关接口和实现类 1.4.1    Toke ...

  10. 【Sort】HeapSort

    堆排序,时间复杂度O(N log N),实际使用中慢于使用Sedgewick增量的增量排序. 大致思路: 1.先在数组中建堆,如果是增量排序,则需要建一个大堆 2.每循环一次,把最大的数,也就是num ...