HttpClient实现调用飞书"更新应用发送的消息"接口和获取tenant_access_token接口的实现,实现更新飞书消息卡片

本篇内容主要是更新飞书消息卡片时参考。

@PostMapping("/feishu")
    public JSONObject feishu(@RequestBody JSONObject jsonParam) {
        Object challenge = jsonParam.get("challenge");
        if(challenge != null && challenge != ""){
            JSONObject challengeObject=new JSONObject();
            challengeObject.put("challenge",challenge);
            return challengeObject;
        }else{
            JSONObject resultBody = new JSONObject();
            JSONObject card = new JSONObject();
            JSONObject header = new JSONObject();
            card.put("header", header);
            JSONObject titleJO = new JSONObject();
            header.put("title", titleJO);
            titleJO.put("tag", "plain_text");
            titleJO.put("content", "测试回馈信息");
            JSONArray elements = new JSONArray();
            card.put("elements", elements);

            JSONObject action = new JSONObject();
            elements.add(action);
            action.put("tag", "action");
            JSONArray actions = new JSONArray();
            action.put("actions", actions);

            //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓消息卡片中增加同意和驳回按钮↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
            JSONObject approveButtton = new JSONObject();
            actions.add(approveButtton);
            approveButtton.put("tag", "button");
            JSONObject approveButttonText = new JSONObject();
            approveButtton.put("text", approveButttonText);
            approveButttonText.put("tag", "plain_text");
            approveButttonText.put("content", "同意");
            approveButtton.put("type","approve");
            JSONObject approveVal = new JSONObject();
            approveButtton.put("value",approveVal);
            approveVal.put("chosen","approve");


            JSONObject declineButtton = new JSONObject();
            actions.add(declineButtton);
            declineButtton.put("tag", "button");
            JSONObject declineButttonText = new JSONObject();
            declineButtton.put("text", declineButttonText);
            declineButttonText.put("tag", "plain_text");
            declineButttonText.put("content", "驳回");
            declineButtton.put("type","approve");
            JSONObject declineVal = new JSONObject();
            declineButtton.put("value",declineVal);
            declineVal.put("chosen","approve");

            //交互元素布局,窄版样式默认纵向排列
            //使用 bisected 为二等分布局,每行两列交互元素
            //使用 trisection 为三等分布局,每行三列交互元素
            //使用 flow 为流式布局元素会按自身大小横向排列并在空间不够的时候折行
            action.put("layout","flow");

            //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑消息卡片中增加同意和驳回按钮↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

//            resultBody.putAll(card);

            String msgContent="{\n" +
                    "  \"config\": {\n" +
                    "    \"wide_screen_mode\": true\n" +
                    "  },\n" +
                    "  \"elements\": [\n" +
                    "    {\n" +
                    "      \"fields\": [\n" +
                    "        {\n" +
                    "          \"is_short\": true,\n" +
                    "          \"text\": {\n" +
                    "            \"content\": \"**申请人:**\\n孙宝龙\",\n" +
                    "            \"tag\": \"lark_md\"\n" +
                    "          }\n" +
                    "        },\n" +
                    "        {\n" +
                    "          \"is_short\": true,\n" +
                    "          \"text\": {\n" +
                    "            \"content\": \"**休假类型:**\\n年假\",\n" +
                    "            \"tag\": \"lark_md\"\n" +
                    "          }\n" +
                    "        },\n" +
                    "        {\n" +
                    "          \"is_short\": false,\n" +
                    "          \"text\": {\n" +
                    "            \"content\": \"\",\n" +
                    "            \"tag\": \"lark_md\"\n" +
                    "          }\n" +
                    "        },\n" +
                    "        {\n" +
                    "          \"is_short\": true,\n" +
                    "          \"text\": {\n" +
                    "            \"content\": \"**时间:**\\n2020-4-8 至 2020-4-10(共3天)\",\n" +
                    "            \"tag\": \"lark_md\"\n" +
                    "          }\n" +
                    "        },\n" +
                    "        {\n" +
                    "          \"is_short\": true,\n" +
                    "          \"text\": {\n" +
                    "            \"content\": \"**备注:**\\n因家中有急事,需往返老家,故请假\",\n" +
                    "            \"tag\": \"lark_md\"\n" +
                    "          }\n" +
                    "        }\n" +
                    "      ],\n" +
                    "      \"tag\": \"div\"\n" +
                    "    },\n" +
                    "    {\n" +
                    "      \"tag\": \"hr\"\n" +
                    "    },\n" +
                    "    {\n" +
                    "      \"actions\": [\n" +
                    "        {\n" +
                    "          \"tag\": \"button\",\n" +
                    "          \"text\": {\n" +
                    "            \"content\": \"批准\",\n" +
                    "            \"tag\": \"plain_text\"\n" +
                    "          },\n" +
                    "          \"type\": \"primary\",\n" +
                    "          \"value\": {\n" +
                    "            \"chosen\": \"approve\"\n" +
                    "          }\n" +
                    "        },\n" +
                    "        {\n" +
                    "          \"tag\": \"button\",\n" +
                    "          \"text\": {\n" +
                    "            \"content\": \"拒绝\",\n" +
                    "            \"tag\": \"plain_text\"\n" +
                    "          },\n" +
                    "          \"type\": \"danger\",\n" +
                    "          \"value\": {\n" +
                    "            \"chosen\": \"decline\"\n" +
                    "          }\n" +
                    "        }\n" +
                    "      ],\n" +
                    "      \"layout\": \"bisected\",\n" +
                    "      \"tag\": \"action\"\n" +
                    "    }\n" +
                    "  ],\n" +
                    "  \"header\": {\n" +
                    "    \"template\": \"blue\",\n" +
                    "    \"title\": {\n" +
                    "      \"content\": \"你有一个休假申请待审批\",\n" +
                    "      \"tag\": \"plain_text\"\n" +
                    "    }\n" +
                    "  }\n" +
                    "}";
            JSONObject jsonObject = JSONObject.parseObject(msgContent);
//            resultBody.putAll(jsonObject);
//            resultBody.putAll(card);

            //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓获取tenant_access_token↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
            CloseableHttpClient getTenantTokenHttpClient = HttpClients.createDefault();
            HttpPost getTenantTokenHttpPost = new HttpPost("https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal");
            Header[] getTenantTokenheaders = {
                    new BasicHeader("Content-Type","application/json; charset=utf-8")
            };
            getTenantTokenHttpPost.setHeaders(getTenantTokenheaders);
            JSONObject getTenantTokenBody = new JSONObject();
            getTenantTokenBody.put("app_id","飞书应用中的app_id值");
            getTenantTokenBody.put("app_secret","飞书应用中的app_secret值");
            String jsonPrarms = getTenantTokenBody.toJSONString();
            HttpEntity entityParam = new StringEntity(jsonPrarms, ContentType.create("application/json", "UTF-8"));  //这里的“application/json” 可以更换因为本人是传的json参数所以用的这个
            getTenantTokenHttpPost.setEntity(entityParam);

            String tenant_access_token = null;
            try {
                CloseableHttpResponse tenantToken = getTenantTokenHttpClient.execute(getTenantTokenHttpPost);
                HttpEntity httpEntity = tenantToken.getEntity();
                /**
                 * 推荐消耗实体内容的方式是使用它的 getContent()方法或 writeTo(OutputStream)方法,除非
                 * 响应实体源自可靠的HTTP服务器和已经长度限制。
                 */
                InputStream inputStream = httpEntity.getContent();
                //<1>创建字节数组输出流,用来输出读取到的内容
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                //<2>创建缓存大小
                byte[] buffer = new byte[1024]; // 1KB
                //每次读取到内容的长度
                int len = -1;
                //<3>开始读取输入流中的内容
                while ((len = inputStream.read(buffer)) != -1) { //当等于-1说明没有数据可以读取了
                    baos.write(buffer, 0, len);   //把读取到的内容写到输出流中
                }
                //<4> 把字节数组转换为字符串
                String content = baos.toString();
                //<5>关闭输入流和输出流
                inputStream.close();
                baos.close();
                JSONObject result = JSONObject.parseObject(content);
                tenant_access_token = result.getString("tenant_access_token");

                System.out.println("111");
            } catch (IOException e) {
                e.printStackTrace();
            }
            //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑获取tenant_access_token↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

            //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓更新应用发送的消息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
            String open_message_id = jsonParam.getString("open_message_id");
//            String token = jsonParam.getString("token");
            String token = tenant_access_token;
            CloseableHttpClient httpClient = HttpClients.createDefault();
            HttpPatch httpPatch = new HttpPatch();
            String URL1= "https://open.feishu.cn/open-apis/im/v1/messages/"+open_message_id;
            try {
                URI uri = new URI(URL1);
                httpPatch.setURI(uri);
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
            Header[] headers = {
                    new BasicHeader("Authorization", "Bearer "+token),
                    new BasicHeader("Content-Type","application/json; charset=utf-8")
            };
            httpPatch.setHeaders(headers);
            List<NameValuePair> list = new LinkedList<>();
            BasicNameValuePair param1 = new BasicNameValuePair("content", msgContent);
            list.add(param1);
            JSONObject body = new JSONObject();
            body.put("content",msgContent);
            String jsonPrarmBody = body.toJSONString();
            HttpEntity entityParamBody = new StringEntity(jsonPrarmBody, ContentType.create("application/json", "UTF-8"));  //这里的“application/json” 可以更换因为本人是传的json参数所以用的这个
            httpPatch.setEntity(entityParamBody);
            try {
                CloseableHttpResponse execute = httpClient.execute(httpPatch);
                System.out.println("222");
            } catch (IOException e) {
                e.printStackTrace();
            }
            //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑更新应用发送的消息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
            return resultBody;
        }
    }
msgContent:就是要更新的消息卡片,可以到飞书的消息卡片搭建工具中调好样式然后直接复制,
消息卡片搭建工具:https://open.feishu.cn/tool/cardbuilder?from=howtoguide
posted on 2022-03-18 17:57  宇宙小子  阅读(1032)  评论(0编辑  收藏  举报