前言

  之前有介绍过HttpClient作为爬虫的简单使用,那么今天在简单的介绍一下它的另一个用途:在服务端调用接口API进行交互。之所以整理这个呢,是因为前几天在测试云之家待办消息接口的时候,有使用云之家外出登记LightApp中的HttpHelper,觉得抽的很不错,就拿来记录一下,便于日后直接使用。

HttpHelper.jar下载链接:https://pan.baidu.com/s/1d0OeVfJM_jHWjJunl7nPHQ 密码: ujeg

应用

  先来介绍怎么使用的,目的就是拿来直接用。然后在分析其内在的手法。

  1. 使用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)));
  2. 表单形式参数发送请求 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的更多相关文章

  1. 信鸽推送 .NET (C#) 服务端 SDK rest api 调用库(v1.2)

    信鸽推送 .NET  服务端 SDK rest api 调用库-介绍 该版本是基于信鸽推送v2版本的时候封装的,先拿出来与大家分享,封装还还凑合,不依赖其他http调用件,唯一依赖json序列化dll ...

  2. python的flex服务端数据接口开发

    python的flex服务端数据接口开发 python 如果给flex提供服务端,需要提供一个网关和一个可供客户端(flex)调用的类.这方面我更加推荐用twisted来写这个网关,因为twisted ...

  3. GrapeCity Documents (服务端文档API组件) V3.0 正式发布

    近日,葡萄城GrapeCity Documents(服务端文档API组件)V3.0 正式发布! 该版本针对 Excel 文档.PDF 文档和 Word 文档的 API 全面更新,加入了用于生成 Exc ...

  4. 服务端调用js:javax.script

    谈起js在服务端的应用,大部分人的第一反应都是node.js.node.js作为一套服务器端的 JavaScript 运行环境,有自己的独到之处,但不是所有的地方都需要使用它. 例如在已有的服务端代码 ...

  5. WCF服务端调用client.

    wcf服务端 1,新建一个"windows窗口程序"名称为WCFServer2. 2.然后加入一个"WCF服务"名称为Service1. 详细步骤为:解决方式试 ...

  6. vue 服务代理 调用第三方api

    项目中前期需要调用第三方API来获取汇率.因为直接调用会有跨域的问题,所以使用来服务代理. 在config配置代理可以这样写: 而调用接口就可以这样写: 坑:配置完成后一直报500,开始怀疑人生.最后 ...

  7. Wince 6.0适用 .NET 使用HttpRequest的Post上传文件,服务端的Web API接收Post上传上来的文件 代码

    //调用的示例 private string fileName = "InStorageData.csv"; string filePath = parentPath + Comm ...

  8. php使用webservice调用C#服务端/调用PHP服务端

    由于公司业务需要,用自产平台对接某大厂MES系统,大厂提出使用webservice来互通,一脸懵逼啊,一直没有使用过php的webservice的我,瞬间打开手册开始阅读,最终爬过无数坑之后,总结出如 ...

  9. 友盟推送 .NET (C#) 服务端 SDK rest api 调用库

    友盟推送 .NET SDK rest api 介绍 该版本是基于友盟推送2.3版本封装的,网上查询了下发现没有.NET版本的调用库,官方也没有封装.NET的版本,只有python.java.php版本 ...

随机推荐

  1. 1053. [HAOI2007]反素数ant【DFS+结论】

    Description 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x ,则称x为反质数.例如,整数 ...

  2. Kali-linux使用Maltego收集信息

    Maltego是一个开源的漏洞评估工具,它主要用于论证一个网络内单点故障的复杂性和严重性.该工具能够聚集来自内部和外部资源的信息,并且提供一个清晰的漏洞分析界面.本节将使用Kali Linux操作系统 ...

  3. Dubbo实践(七)扩展点

    与JDK的SPI机制类似,Dubbo也在META-INF路径下定义了多种扩展接口.只是JDK SPI机制是Java后台帮你实现读取文件并对接具体的实现类,而Dubbo是自己去读文件. 扩展点配置 扩展 ...

  4. PAT——1059. C语言竞赛

    C语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛.既然竞赛主旨是为了好玩,颁奖规则也就制定得很滑稽: 0. 冠军将赢得一份“神秘大奖”(比如很巨大的一本学生研究论文集……).1. 排名为素数的学生将 ...

  5. 循环获取某个class下的多个select的选中值

    //循环获取某个class下的多个select的选中值 function eachSelect(cla){ var val = ""; $("."+cla).e ...

  6. What to do next to activate this settings for already existing users

    Link: http://sharepoint.stackexchange.com/questions/89284/sharepoint-2013-mysite-increase-quota Cent ...

  7. Notes 20180505 : 计算机的基础知识

    总是想要去深入了解一下计算机,可真正去了解的时候才发现那并非一日之功,关于计算机的学习,并未放弃,但是化知识为笔记尚需时日,今日我们先简单了解一下计算机,然后开始Java语言的学习. 1 计算机的基础 ...

  8. CORS跨域实现思路及相关解决方案

    本篇包括以下内容: CORS 定义 CORS 对比 JSONP CORS,BROWSER支持情况 主要用途 Ajax请求跨域资源的异常 CORS 实现思路 安全说明 CORS 几种解决方案 自定义CO ...

  9. leyer不写content参数直接传递给子页面数据

    function btnAddClickownfund(){ //获取数据 var actual = $("#actual_capitals").html().trim(); // ...

  10. (Oracle)DBMS_SYSTEM工具-01[20180510]

    分析描述:     使用DBMS_SYSTEM分析SQL语句执行,并且获取SQL会话中的绑定变量.等待事件.消耗资源和执行计划等等. 环境介绍:     Oracle 11.2.0.4.0     L ...