简述:项目中需要调用第三方restful服务,涉及get,post请求,且带有请求头,直接使用spring的restTemplate,具体口径及代码如下文。
1、获取管理员权限 token(post请求)
HTTP请求
POST {https://host}/{org_name}/{app_name}/token
请求 header
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
Content-Type | String | 必需 | 内容类型:application/json |
请求 body
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
grant_type | String | 必需 | client_credentials ,固定字符串。 |
client_id | String | 必需 | App 的 client_id ,参见 app 详情页面。 |
client_secret | String | 必需 | App 的 client_secret ,参见 app 详情页面。 |
ttl | Long | 必需 | 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-Type | String | 是 | 内容类型。请填 application/json 。 |
Accept | String | 是 | 内容类型。请填 application/json 。 |
Authorization | String | 是 |
|
请求 body
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
username | String | 是 | 用户 ID,长度不可超过 64 个字节长度。不可设置为空。支持以下字符集: • 26 个小写英文字母 a-z; • 26 个大写英文字母 A-Z; • 10 个数字 0-9; • “_”, “-”, “.”。 注意: • 该参数不区分大小写,因此 Aa 和 aa 为相同用户名;• 请确保同一个 app 下, username 唯一;• username 用户 ID 是会公开的信息,请勿使用 UUID、邮箱地址、手机号等敏感信息。 |
password | String | 是 | 用户的登录密码,长度不可超过 64 个字符。 |
nickname | String | 否 | 推送消息时,在消息推送通知栏内显示的用户昵称,并非用户个人信息的昵称。长度不可超过 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
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
Accept | String | 是 | 内容类型。请填 application/json 。 |
Authorization | String | 是 | Bearer ${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<>();
}