给项目分配标签
| 接口名 | PUT: /login-register/open-api/projects/{projectCode}/tags | |||
| 入参:(body传值) | application/json | |||
| 是否必传 | 默认值 | 描述 | 备注 | |
| projectCode | 是 | - | 项目编码 | 外部平台的项目唯一编码 |
| tagCodes | 是 | - | 期望的标签编码列表(全量) | 多个用英文逗号分开 |
| 入参:(Header传值) | ||||
| Authorization | 是 | - | 传递AccessToken | 格式:Bearer {AccessToken} |
| 入参示例:(application/json) | ||||
|
{
"tagCodes": "TAG_OpenApi_001"
}
|
||||
| 回参示例:(application/json) | ||||
|
{
"code": 0,
"msg": null,
"data": null,
"ok": true
}
|
||||
package com.hoteam.sview.demo;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.ContentType;
import cn.hutool.http.Header;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpStatus;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
import java.util.Map;
/**
* 给项目全量分配标签Demo
* 接口:POST /login-register/open-api/projects/{projectCode}/tags
* <p>
* 说明:tagCodes 为全量标签编码列表,会覆盖项目原有标签绑定关系
* 成功判定:HTTP 200 且 code=0
* 失败:HTTP 401 / 非 2xx / code!=0 / 网络异常,返回 false
*/
@Slf4j
public class AssignTagFullToProjectHutoolDemo {
/** 接口基础地址(按实际环境替换 host) */
private static final String BASE_URL = "http://your-host/login-register/open-api/projects";
/** AccessToken(按实际值替换,可通过 /auth/oauth2/token 接口预先获取) */
private static final String ACCESS_TOKEN = "your_access_token";
public static void main(String[] args) {
// 示例:给项目全量分配标签
boolean assignResult = fullAssignTagToProject(
"PROJ_001", // projectCode 项目编码(必填,路径变量)
"TAG_OpenApi_001,TAG_002" // tagCodes 全量标签编码列表,多个英文逗号分隔(必填)
);
if (!assignResult) {
log.warn("项目全量分配标签失败");
return;
}
log.info("项目全量分配标签成功");
}
/**
* 给项目全量分配标签
*
* @param projectCode 项目外部唯一编码(必填,作为路径变量)
* @param tagCodes 期望绑定的全量标签编码列表,多个标签英文逗号隔开(必填)
* @return 成功返回 true;失败返回 false
*/
public static boolean fullAssignTagToProject(String projectCode, String tagCodes) {
// 1. 参数校验
if (StrUtil.isBlank(projectCode) || StrUtil.isBlank(tagCodes)) {
log.warn("项目全量分配标签必填参数缺失:projectCode={}, tagCodes={}", projectCode, tagCodes);
return false;
}
// 2. 拼接完整接口路径
String requestUrl = BASE_URL + "/" + projectCode + "/tags";
// 3. 组装请求体
Map<String, Object> requestMap = new HashMap<>();
requestMap.put("tagCodes", tagCodes);
String requestBody = JSONUtil.toJsonStr(requestMap);
log.info("项目全量分配标签请求地址:{},请求报文:{}", requestUrl, requestBody);
// 4. 发起请求
try (HttpResponse response = HttpRequest.post(requestUrl)
// 公共 Header
.header("tenant-id", "1")
.header("deviceId", "web")
.header("deviceModel", "web")
.header("deviceType", "4")
.header("lang", "zh-CN")
// 认证 + Content-Type
.header(Header.AUTHORIZATION, "Bearer " + ACCESS_TOKEN)
.header(Header.CONTENT_TYPE, ContentType.JSON.getValue())
.body(requestBody)
.timeout(10_000)
.execute()) {
int status = response.getStatus();
String body = response.body();
log.info("项目全量分配标签响应:status={}, body={}", status, body);
// 4.1 401 认证失败
if (status == HttpStatus.HTTP_UNAUTHORIZED) {
log.warn("项目全量分配标签认证失败(401),accessToken 可能失效,body={}", body);
return false;
}
// 4.2 非 2xx 或响应体为空
if (!response.isOk() || StrUtil.isBlank(body)) {
log.warn("项目全量分配标签请求失败:status={}, body={}", status, body);
return false;
}
// 5. 业务字段判定:仅以 code=0 为成功
JSONObject json = JSONUtil.parseObj(body);
Integer code = json.getInt("code");
if (code == null || code != 0) {
log.warn("项目全量分配标签业务失败:code={}, msg={}", code, json.getStr("msg"));
return false;
}
return true;
} catch (Exception e) {
log.error("调用项目全量分配标签接口异常", e);
return false;
}
}
}