原文地址: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. [论文理解] Connectionist Text Proposal Network

    Connectionist Text Proposal Network 简介 CTPN是通过VGG16后在特征图上采用3*3窗口进行滑窗,采用与RPN类似的anchor机制,固定width而只预测an ...

  2. [神经网络]一步一步使用Mobile-Net完成视觉识别(二)

    1.环境配置 2.数据集获取 3.训练集获取 4.训练 5.调用测试训练结果 6.代码讲解 本文是第二篇,调用官方例子并获取数据集. 上一节里面记得我们需要配置PYTHONPATH,大家应该发现,每次 ...

  3. 一些常用的HTML标签

    由于本人目前没有系统学习,日常碰见哪个有用就记下来. pre标签 可定义预格式化的文本,在pre元素中的文本会保留空格和换行符.比如我们展示源代码的时候,只要放一个pre标签,然后把代码直接复制.粘贴 ...

  4. strlen、strcpy、strcat的实现

    概念: 1.strlen:strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然 ...

  5. ubuntu 16.04 +anaconda3.6 +Nvidia DRIVER 390.77 +CUDA9.0 +cudnn7.0.4+tensorflow1.5.0+neural-style

    这是我第一个人工智能实验.虽然原理不是很懂,但是觉得深度学习真的很有趣.教程如下. Table of Contents 配置 时间轴 前期准备工作 anaconda3 安装 bug 1:conda:未 ...

  6. Codevs1082 线段树练习 3

    题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. 输入描述 Input Description 第一行一个正整数n,接下 ...

  7. Pandas中数据的处理

    有两种丢失数据 ——None ——np.nan(NaN) None是python自带的,其类型为python object.因此,None不能参与到任何计算中 Object类型的运算比int类型的运算 ...

  8. Centos7离线部署kubernetes 1.13集群记录

    一.说明 本篇主要参考kubernetes中文社区的一篇部署文章(CentOS 使用二进制部署 Kubernetes 1.13集群),并做了更详细的记录以备用. 二.部署环境 1.kubernetes ...

  9. 使用三层交换配置DHCP为不同VLAN分配IP地址

    三层交换的原理以及DHCP的原理,作者在这里就不详细的解释了,在这里通过一个案例来了解使用三层交换做DHCP服务器,并为不同网段分配IP地址.在生产环境中,使用路由器或交换机做DHCP服务器要常见一些 ...

  10. Linux基础学习-LVM逻辑卷管理遇到的问题

    LVM学习逻辑卷管理创建逻辑卷遇到的问题 1 实验环境 系统 内核 发行版本 CentOS 2.6.32-754.2.1.el6.x86_64 CentOS release 6.10 (Final) ...