原文地址:Jersey客户端API调用REST风格的Web服务

【节选】

要开始使用 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 资源。

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

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

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

【实例】

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实现Client端:GET/PUT/POST/DELETE的更多相关文章

  1. Eureka服务注册中心错误:com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused: connect

    报错信息 14:43:45.484 [main] INFO com.netflix.discovery.DiscoveryClient - Getting all instance registry ...

  2. Linux下的C Socket编程 -- 简介与client端的处理

    Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...

  3. Python自动化之rabbitmq rpc client端代码分析(原创)

    RPC调用client端解析 import pika import uuid # 建立连接 class FibonacciRpcClient(object): def __init__(self): ...

  4. 用C#基于WCF创建TCP的Service供Client端调用

    本文将详细讲解用C#基于WCF创建TCP的Service供Client端调用的详细过程 1):首先创建一个Windows Service的工程 2):生成的代码工程结构如下所示 3):我们将Servi ...

  5. 从零开始学习Node.js例子四 多页面实现数学运算 续二(client端和server端)

    1.server端 支持数学运算的服务器,服务器的返回结果用json对象表示. math-server.js //通过监听3000端口使其作为Math Wizard的后台程序 var math = r ...

  6. Zookeeper全解析——Client端(转)

    Zookeeper的Client直接与用户打交道,是我们使用Zookeeper的interface.了解ZK Client的结构和工作原理有利于我们合理的使用ZK,并能在使用中更早的发现问题.本文将在 ...

  7. JDE报表开发笔记(Client端导出Excel乱码)

    之前导出Excel时没发生任何问题, Client端PL/SQL字符集为UTF-8 Oracle JDE E910字符集为UTF-8 解决方式:添加指定用户的字符集(上图即为修改后的用户字符集) 角色 ...

  8. JS读取client端的文件的代码片段

    JS读取client端的文件内容的代码片段 if(window.FileReader){ var html5file = this.pipeDetailFileUpLoader._files[0]; ...

  9. 获得WCF Client端的本地端口 z

    当WCF调用远程服务时,显示该调用的网速或流量.其中比较关键的一步就是需要获得WCF  Client端的本地端口,原来以为是个简单的事情,结果查了1个多小时谷歌,硬是没找到好的法子,只有自己动手了. ...

随机推荐

  1. codeforce Gym 100570B ShortestPath Query (最短路SPFA)

    题意:询问单源最短路径,每条边有一个颜色,要求路径上相邻边的颜色不能相同,无重边且边权为正. 题解:因为路径的合法性和边的颜色有关, 所以在做spfa的时候,把边丢到队列中去,松弛的时候注意判断一下颜 ...

  2. 文本框复制代码,兼容大部分浏览器(ZeroClipboard插件、附件)

    ;;list-style-type:none;} a,img{;} body{font:12px/180% Arial, Helvetica, sans-serif ,"新宋体"; ...

  3. 使用lua做序列化和反序列化

    -- lua对象序列化 function serialize(obj) local lua = "" local t = type(obj) if t == "numbe ...

  4. C/C++字符串笔试知识点及实例

    一.C字符串与C++字符串的深入理解 对于C语言,需要区分C字符串和C字符数组.  C字符串:以字符NULL('\0')结尾的字符数组:  C字符数组:数组元素类型为字符类型. C字符串的的初始化:c ...

  5. Oracle 数据库常用SQL语句(1)

    一.数据定义语句 CREATE:创建表或其它对象 create database test; //创建test数据库 ),sex )); //创建表 ALTER:修改表或其它对象的结构 )); //为 ...

  6. C语言中sizeof的用法

    今天同学问我sizeof可不可以计算结构体的大小,我竟然忘了C语言还有sizeof这个函数,我是多久没有写程序了啊!!!惭愧,上研究生后写嵌入式方面的程序就特别少了,看来以后还要经常来练练手才行.现在 ...

  7. Java-downloadFileByLink

    import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.ByteArrayOutputStr ...

  8. 安装VS2010 无法打开数据文件deffactory.dat

    VS2010旗舰版可用Key: YCFHQ9DWCYDKV88T2TMHG7BHP 解压VS2010安装ISO文件,找到setup\deffactory.dat文件,用记事本打开,将里面内容清空,将以 ...

  9. poj 1979 走多少个‘ . '问题 dfs算法

    题意:给你一个迷宫地图,让你走.问最多可以走多少个“." 思路:dfs 找到起点,然后对起点进行dfs操作. dfs操作时,要把当前的位置标志成"#"表示已经走过,然后进 ...

  10. ReportViewer部分使用总结

    最近winform上使用ReportViewer做报表,因为之前没弄过,所以遇到了很多问题,现在总结一下. 一.运行环境 .net环境:4.0 开发工具:vs2010 二.开发步骤 第一步,在winf ...