服务端调用接口API利器之HttpClient
前言
之前有介绍过HttpClient作为爬虫的简单使用,那么今天在简单的介绍一下它的另一个用途:在服务端调用接口API进行交互。之所以整理这个呢,是因为前几天在测试云之家待办消息接口的时候,有使用云之家外出登记LightApp中的HttpHelper,觉得抽的很不错,就拿来记录一下,便于日后直接使用。
HttpHelper.jar下载链接:https://pan.baidu.com/s/1d0OeVfJM_jHWjJunl7nPHQ 密码: ujeg
应用
先来介绍怎么使用的,目的就是拿来直接用。然后在分析其内在的手法。
- 使用Json格式的参数进行请求
Json参数工具使用的是alibaba fastjson-1.2.43.jar
/**
* gateway发送json参数POST请求
*
* @param url
* @param parm
* @return
* @throws Exception
*/
public static String gatewayRequestJson(String url, String parm) throws Exception {
Map headers = new HashMap(1);
headers.put("Content-Type", APPLICATION_JSON);
return HttpHelper.post(headers, parm, url, timeoutMillis);
}调用云之家待办消息APIdemo


/*************************S测试参数组装************/
// 推送待办消息
String scope = "app"; // String scope = "app"; resGroupSecret 待办
String eid = "10272669";
String appId = "500051942";
String sourceId = "jzyj2eeappdemo";
String content = "xxx的360°需要您评核";
String title = "待办测试";
String headImg = "https://www.yunzhijia.com/space/c/photo/load?id=5b17b7efe4b00656b6c41a50";
String url = "https://open.yunzhijia.com/gitbook-wiki/server-api/newTodo.html?q="; List params = new ArrayList();
Map map = new HashMap();
Map map2 = new HashMap();
map2.put("DO", 0);
map2.put("READ", 0);
map.put("status", map2);
map.put("openId", "5b17b7efe4b00656b6c41a50");
params.add(map); Map parm = new HashMap(2);
parm.put("appId", appId);
parm.put("sourceId", sourceId);
parm.put("content", content);
parm.put("title", title);
parm.put("headImg", headImg);
parm.put("url", url);
parm.put("params", params); /*************************E测试参数组装************/ //获取云之家授权令牌accessToken
String accessToken = getAccessToken(appId, appSecret, eid, scope); //待办accessToken // 组装云之家请求API url
String requestUrl = gatewayHost.concat("/newtodo/open/generatetodo.json?accessToken=").concat(accessToken); // 发送请求
Object res = JSONObject
.parseObject(gatewayRequestJson(requestUrl, JSONObject.toJSONString(parm))); - 表单形式参数发送请求 application/x-www-form-urlencoded
/**
* gateway发送application/x-www-form-urlencoded参数POST请求
*
* @param url
* @param parm
* @return
* @throws Exception
*/
public static String gatewayRequest(String url, Map parm) throws Exception {
Map headers = new HashMap(1);
headers.put("Content-Type", APPLICATION_X_WWW_FORM_URLENCODED);
return HttpHelper.post(headers, parm, url, timeoutMillis);
}调取云之家人员指定人员信息demo


其中data参数中既有整型变量又有数组,此时又该如何组装参数呢?其中接口API已经规定内容类型ContenType为表单类型。
// 云之家人员信息令牌
String accessToken = getAccessToken(appId, appSecret, null, scope); // 获取人员信息API url
String personUrl = gatewayHost.concat("/openimport/open/person/get?accessToken=").concat(accessToken);
/**************S组装表单参数**************************/
Map paramters = new HashMap(2);
paramters.put("eid", eid);
JSONObject jo = new JSONObject();
jo.put("eid", eid);
jo.put("type", 0); JSONArray ja = new JSONArray();
ja.add("123321231231");//电话号码 jo.put("array", ja); paramters.put("nonce", UUID.randomUUID().toString());
paramters.put("data", jo.toString());
/***************E组装表单参数*************************/ //请求API
String res = gatewayRequest(personUrl, paramters); Object parseObject = JSONObject.parseObject(res);获取云之家授权令牌accessToken,参考测试代码
public static String getAccessToken(String appId, String secret, String eid, String scope) {
TokenBean tokenBean = new TokenBean();
// 判断当前token是否在有效期内
if (tokenBean != null && tokenBean.getAccessToken() != null && scope.equals(tokenBean.getScope())
&& StringUtils.isNotBlank(eid) && eid.equals(tokenBean.getEid())) {
if ((System.currentTimeMillis() - tokenBean.getUpdateTime().getTime())
/ 1000 < (tokenBean.getExpireIn() - 300)) {
// logger.debug("返回有效期内的access_token: {}", tokenBean.getAccessToken());
return tokenBean.getAccessToken();
}
} // 如果没有token信息或者已经过期, 重新从api获取
final String[] SCOPES = { "app", "team", "resGroupSecret" };
String timestamp = String.valueOf(System.currentTimeMillis());
Map parm = new HashMap(5);
parm.put("scope", scope);
parm.put("timestamp", timestamp); if (scope.equals(SCOPES[0])) {
parm.put("appId", appId);
} else if (scope.equals(SCOPES[1])) {
parm.put("eid", eid);
}
if (scope.equals(SCOPES[2])) {
// 获取resGroupSecret秘钥
parm.put("eid", eid);
secret = erpSecret;
} parm.put("secret", secret);
String url = gatewayHost.concat("/oauth2/token/getAccessToken");
JSONObject result = null;
try {
result = JSONObject
.parseObject(GatewayAuth2.gatewayRequestJson(url, JSONObject.toJSONString(parm)))
.getJSONObject("data");
} catch (Exception e) {
e.printStackTrace();
// logger.error("获取access_token信息失败!, 返回null");
} // logger.debug("获取access_token返回数据: {}", result);
tokenBean = JSON.toJavaObject(result, TokenBean.class); if (tokenBean != null && tokenBean.getAccessToken() != null) {
tokenBean.setUpdateTime(new Date());
tokenBean.setScope(scope);
tokenBean.setEid(eid);
// tokenDao.setToken(tokenBean); // 缓存获取的token信息
// logger.debug("返回新获取的access_token: {}", tokenBean.getAccessToken());
return tokenBean.getAccessToken();
}
// logger.error("获取access_token信息失败!, 返回null");
return null; }
服务端调用接口API利器之HttpClient的更多相关文章
- 信鸽推送 .NET (C#) 服务端 SDK rest api 调用库(v1.2)
信鸽推送 .NET 服务端 SDK rest api 调用库-介绍 该版本是基于信鸽推送v2版本的时候封装的,先拿出来与大家分享,封装还还凑合,不依赖其他http调用件,唯一依赖json序列化dll ...
- python的flex服务端数据接口开发
python的flex服务端数据接口开发 python 如果给flex提供服务端,需要提供一个网关和一个可供客户端(flex)调用的类.这方面我更加推荐用twisted来写这个网关,因为twisted ...
- GrapeCity Documents (服务端文档API组件) V3.0 正式发布
近日,葡萄城GrapeCity Documents(服务端文档API组件)V3.0 正式发布! 该版本针对 Excel 文档.PDF 文档和 Word 文档的 API 全面更新,加入了用于生成 Exc ...
- 服务端调用js:javax.script
谈起js在服务端的应用,大部分人的第一反应都是node.js.node.js作为一套服务器端的 JavaScript 运行环境,有自己的独到之处,但不是所有的地方都需要使用它. 例如在已有的服务端代码 ...
- WCF服务端调用client.
wcf服务端 1,新建一个"windows窗口程序"名称为WCFServer2. 2.然后加入一个"WCF服务"名称为Service1. 详细步骤为:解决方式试 ...
- vue 服务代理 调用第三方api
项目中前期需要调用第三方API来获取汇率.因为直接调用会有跨域的问题,所以使用来服务代理. 在config配置代理可以这样写: 而调用接口就可以这样写: 坑:配置完成后一直报500,开始怀疑人生.最后 ...
- Wince 6.0适用 .NET 使用HttpRequest的Post上传文件,服务端的Web API接收Post上传上来的文件 代码
//调用的示例 private string fileName = "InStorageData.csv"; string filePath = parentPath + Comm ...
- php使用webservice调用C#服务端/调用PHP服务端
由于公司业务需要,用自产平台对接某大厂MES系统,大厂提出使用webservice来互通,一脸懵逼啊,一直没有使用过php的webservice的我,瞬间打开手册开始阅读,最终爬过无数坑之后,总结出如 ...
- 友盟推送 .NET (C#) 服务端 SDK rest api 调用库
友盟推送 .NET SDK rest api 介绍 该版本是基于友盟推送2.3版本封装的,网上查询了下发现没有.NET版本的调用库,官方也没有封装.NET的版本,只有python.java.php版本 ...
随机推荐
- 远程调用内核接口的封装类(RCKObjs)
RCK 包括 Application, Function, Connection, Command, Response 和 Fields 六 大类, 其主要功能例如以下: a. Applica ...
- 【[NOI2010]超级钢琴】
我竟然又在写主席树 现在可是九月啦,我却还在写这种noip不可能考的算法 我觉得我真的要凉 题意很明确,就是给你一个序列,让从中选择\(k\)段连续的序列,长度必须大于等于\(L\)小于等于\(R\) ...
- 【[JXOI2017]加法】
江西竟然还有省选,而且还是可怜题,实在是有点可怕 这道题还是比较清真的,大概是最简单的可怜题? 首先看到最大值最小,就很容易想到了二分答案 对于一个二分出来的答案\(mid\),去把原数列扫一遍就可以 ...
- ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters
转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9281366.html ValueError: All strings must be XML compati ...
- 1、Android-活动(下)
1.4.活动的生命周期 对于活动来说生命周期的理解时非常重要的 当对其生命周期有了足够的了解,可以很好的写出程序 1.4.1.返回栈 Android中的活动是可以层叠的 没启动一个新的活动,就会立即覆 ...
- Kali-linux分析密码
在实现密码破解之前,介绍一下如何分析密码.分析密码的目的是,通过从目标系统.组织中收集信息来获得一个较小的密码字典.本节将介绍使用Ettercap工具或MSFCONSOLE来分析密码. 8.2.1 E ...
- VS2012与VS2015同时安装用VS2012创建MFC程序时弹出编译错误”fatal error C1083: 无法打开包括文件:“mprapidef.h”: No such file or directory”的解决办法
在WIndows 7操作系统上同时安装VS2012与VS2015并用VS2012创建MFC程序时弹出编译错误”fatal error C1083: 无法打开包括文件:“mprapidef.h”: No ...
- CSS 学习路线(二)选择器
选择器 规则结构: 分两个基本部分 选择器(selector)和声明块(declaration block) 组成 声明块:由一个或多个声明组成,每一个声明都是属性-值对 选择器分为:元素选择器,类选 ...
- C# 反射 Reflection Assembly
本章节带来的是反射,反射反射程序员的快乐. 一.什么叫反射 反射:是.net Framework提供给的一个方面metadata的帮助类,可以获取信息并且使用 反射的有点:动态 反射的缺点:1:稍微麻 ...
- 请问在一个命令上加什么参数可以实现下面命令的内容在同一行输出。 echo "zhaokang";echo "zhaokang"
请问在一个命令上加什么参数可以实现下面命令的内容在同一行输出. echo "zhaokang";echo "zhaokang" [root@zhaokang t ...