RestTemplate学习笔记-企业实际开发场景

简述:项目中需要调用第三方restful服务,涉及get,post请求,且带有请求头,直接使用spring的restTemplate,具体口径及代码如下文。

1、获取管理员权限 token(post请求)

HTTP请求

POST {https://host}/{org_name}/{app_name}/token

请求 header

参数类型是否必需描述
Content-TypeString必需内容类型:application/json

请求 body

参数类型是否必需描述
grant_typeString必需client_credentials ,固定字符串。
client_idString必需App 的 client_id,参见 app 详情页面
client_secretString必需App 的 client_secret,参见 app 详情页面
ttlLong必需token 有效期,单位为秒(s)。此外,也可通过环信即时通讯云控制台设置,参见 用户认证详情页面。该参数值以最新设置为准。

 代码示例:

private String getToken() {
        try {
            RestTemplate restTemplate = new RestTemplate();
            String uri = huanXinProperties.getUrl();
            String orgname = huanXinProperties.getOrgname();
            String appname = huanXinProperties.getAppname();
            String clientId = huanXinProperties.getClientId();
            String clientSecret = huanXinProperties.getClientSecret();
            //请求路径
            String url = uri + "/" + orgname + "/" + appname + "/token";
            //设置请求头
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            //使用map设置请求体
            Map<String, Object> bodyMap = new HashMap<>();
            bodyMap.put("grant_type", "client_credentials");
            bodyMap.put("client_id", clientId);
            bodyMap.put("client_secret", clientSecret);
            bodyMap.put("ttl", 604800);
            //封装请求头和请求体-httpEntity
            HttpEntity<Map<String, Object>> httpEntity = new HttpEntity<>(bodyMap, headers);
            //post请求
            ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, httpEntity, String.class);
            if (HttpStatus.OK.equals(responseEntity.getStatusCode())) {
                String body = responseEntity.getBody();
                if (StrUtil.isEmpty(body)) {
                    return null;
                }
                JSONObject jsonObject = JSONObject.parseObject(body);
                log.info(jsonObject.toString());
                String accessToken = (String) jsonObject.get("access_token");
                int expiresIn = (int) jsonObject.get("expires_in");
                String application = (String) jsonObject.get("application");
                log.info("access_token: " + accessToken);
                log.info("expires_in: " + expiresIn);
                log.info("application: " + application);
                RBucket<String> rBucket = redissonClient.getBucket("HUANXIN_TOKEN");
                rBucket.set(accessToken, expiresIn / (24 * 60 * 60) - 1, TimeUnit.DAYS);
                return accessToken;
            }
        } catch (Exception e) {
            log.error("请求xxtoken异常");
        }
        return null;
    }

2、 注册单个用户(post请求,返回带泛型的map)

HTTP 请求

POST https://{host}/{org_name}/{app_name}/users

请求 header

参数类型是否必需描述
Content-TypeString内容类型。请填 application/json
AcceptString内容类型。请填 application/json
AuthorizationString

Bearer ${YourAppToken} Bearer 是固定字符,后面加英文空格,再加上获取到的 App Token 的值。

 请求 body

参数类型是否必需描述
usernameString用户 ID,长度不可超过 64 个字节长度。不可设置为空。支持以下字符集:
• 26 个小写英文字母 a-z;
• 26 个大写英文字母 A-Z;
• 10 个数字 0-9;
• “_”, “-”, “.”。
注意:
• 该参数不区分大小写,因此 Aa 和 aa 为相同用户名;
• 请确保同一个 app 下,username 唯一;
• username 用户 ID 是会公开的信息,请勿使用 UUID、邮箱地址、手机号等敏感信息。
passwordString用户的登录密码,长度不可超过 64 个字符。
nicknameString推送消息时,在消息推送通知栏内显示的用户昵称,并非用户个人信息的昵称。长度不可超过 100 个字符。支持以下字符集:
• 26 个小写英文字母 a-z;
• 26 个大写英文字母 A-Z;
• 10 个数字 0-9;
• 中文;
• 特殊字符。

 代码示例:

try { 
RestTemplate restTemplate = new RestTemplate();
            String orgname = huanXinProperties.getOrgname();
            String appname = huanXinProperties.getAppname();
            String url = huanXinProperties.getUrl() + "/" + orgname + "/" + appname + "/users";
            Map<String, String> body = new HashMap<>();
            body.put("username", "miqu_user_" + userId);
            body.put("password", DigestUtil.md5Hex("miqu_user_" + userId));

            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            headers.set("Authorization", "Bearer " + appToken);
            HttpEntity<Map<String, String>> requestEntity = new HttpEntity<>(body, headers);
            ResponseEntity<Map<String, Object>> responseEntity = restTemplate.exchange(url, HttpMethod.POST, requestEntity, new ParameterizedTypeReference<Map<String, Object>>() {
            });
            if (HttpStatus.OK.equals(responseEntity.getStatusCode())) {
                Map<String, Object> entityBody = responseEntity.getBody();
                log.info(JSON.toJSONString(entityBody));
                log.info("用户注册到环信成功: " + userId);
                return true;
            }
        } catch (Exception e) {
            log.error(e.getMessage());
            log.error("注册用户到环信失败: " + userId);
        }
        return false;

3、获取单个用户的详情(get请求,带请求头)

HTTP 请求

GET https://{host}/{org_name}/{app_name}/users/{username}

请求 header

参数类型是否必需描述
AcceptString内容类型。请填 application/json
AuthorizationStringBearer ${YourAppToken} Bearer 是固定字符,后面加英文空格,再加上获取到的 App Token 的值。

代码示例:

  public Map<String, Object> userInfo(long userId) {

        String url = huanXinProperties.getUrl() + "/" + huanXinProperties.getOrgname()
                + "/" + huanXinProperties.getAppname() + "/users/" + "miqu_user_" + userId;
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        String appToken = this.refreshToken();
        log.info("appToken1: {}", appToken);
        headers.set("Authorization", "Bearer " + appToken);
        headers.set("Accept", "application/json");
        HttpEntity<Object> httpEntity = new HttpEntity<>(headers);
        ResponseEntity<Map<String, Object>> responseEntity = null;
        try {
            responseEntity = restTemplate.exchange(url, HttpMethod.GET,
                    httpEntity, new ParameterizedTypeReference<Map<String, Object>>() {
                    });
            if (HttpStatus.OK.equals(responseEntity.getStatusCode())) {
                return responseEntity.getBody();
            }
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        return new HashMap<>();

    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值