马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
×
我现在想要查询某个用户的项目,使用的管理员账号,token权限已经开到最大了,但是无论怎么样都查询不出数据
API文档:https://gitlab.cn/docs/jh/api/projects/#%E5%88%86%E9%A1%B5%E9%99%90%E5%88%B6

/**
* 分页查询用户是成员的所有项目(自动处理所有分页)
* @param userId 用户ID
* @param includeInherited 是否包含通过群组继承的项目
* @return 所有用户是成员的项目
* @throws IOException 网络请求异常
*/
public List<Map<String, Object>> getAllUserMemberProjects(Integer userId, boolean includeInherited) throws IOException {
List<Map<String, Object>> allProjects = new ArrayList<>();
int page = 1;
int perPage = 100;
boolean hasMore = true;
while (hasMore) {
List<Map<String, Object>> pageProjects = getUserMemberProjects(userId, includeInherited, page, perPage);
if (pageProjects.isEmpty()) {
hasMore = false;
} else {
allProjects.addAll(pageProjects);
page++;
// 防止无限循环,实际项目中可根据总数量限制
if (pageProjects.size() < perPage) {
hasMore = false;
}
}
}
return allProjects;
}
/**
* 查询指定用户是成员的所有项目
* @param userId 用户ID
* @param includeInherited 是否包含通过群组继承的项目成员关系
* @param page 页码,从1开始
* @param perPage 每页项目数量,最大100
* @return 用户作为成员的项目列表
* @throws IOException 网络请求异常
*/
public List<Map<String, Object>> getUserMemberProjects(Integer userId, boolean includeInherited, int page, int perPage) throws IOException {
if (userId == null) {
throw new IllegalArgumentException("用户ID不能为空");
}
// 确保每页数量不超过100
perPage = Math.min(perPage, 100);
// 构建请求URL
HttpUrl.Builder urlBuilder = HttpUrl.parse(BASE_URL + "/users/"+userId+"/projects")
.newBuilder()
.addQueryParameter("page", String.valueOf(page))
.addQueryParameter("per_page", String.valueOf(perPage))
.addQueryParameter("membership", "true") // 只返回用户是成员的项目
.addQueryParameter("with_access_level", "true") // 返回权限级别
.addQueryParameter("visibility", "private") // 返回权限级别
.addQueryParameter("simple", "false") // 获取完整项目信息
.addQueryParameter("owned", "false") //
;
// 是否包含通过群组继承的成员关系
if (!includeInherited) {
urlBuilder.addQueryParameter("min_access_level", "10");
urlBuilder.addQueryParameter("access_level", "10");
urlBuilder.addQueryParameter("user_access_level", "10");
urlBuilder.addQueryParameter("skip_groups", "true");
urlBuilder.addQueryParameter("include_subgroups", "true");
}
Request request = new Request.Builder()
.url(urlBuilder.build())
.addHeader("Private-Token", PRIVATE_TOKEN) // 使用管理员 Token
.addHeader("Accept", "application/json")
.get()
.build();
try (Response response = client.newCall(request).execute()) {
String responseBody = response.body().string();
if (!response.isSuccessful()) {
throw new IOException("查询用户成员项目失败: " + responseBody);
}
// 解析JSON响应
JsonNode projectsNode = objectMapper.readTree(responseBody);
List<Map<String, Object>> projects = new ArrayList<>();
if (projectsNode.isArray()) {
for (JsonNode projectNode : projectsNode) {
Map<String, Object> project = new HashMap<>();
// 项目基本信息
project.put("projectId", projectNode.get("id").asInt());
project.put("projectName", projectNode.get("name"));
project.put("nameWithNamespace", projectNode.get("name_with_namespace"));
project.put("description", projectNode.has("description") ?
projectNode.get("description").asText() : "");
project.put("webUrl", projectNode.get("web_url"));
// 成员权限信息
int accessLevel = projectNode.get("access_level").asInt();
project.put("accessLevel", accessLevel);
project.put("accessLevelName", getAccessLevelName(accessLevel));
// 成员关系类型(直接添加还是通过群组继承)
project.put("membershipType", projectNode.has("via_group") ?
"inherited (group: " + projectNode.get("via_group").get("name") + ")" :
"direct");
projects.add(project);
}
}
return projects;
}
}
|