SonarQube 从传感器访问 API

问题描述 投票:0回答:1

我想从我的

org.sonar.api.scanner.sensor.ProjectSensor
实现中执行对 Sonar Server 的 API 调用。是否有任何“合规”的执行方式,例如:

https://myserver:9001/api/rules/search?languages=java&tags=regex&f=internalKey

使用例如给定的

org.sonar.api.batch.sensor.SensorContext
?我可以从变量中获取主机 url 并创建自己的连接并解析结果...但如果有兼容的方式,这将是很大的开销。

致以诚挚的问候

延斯

sonarqube sonarqube-scan
1个回答
0
投票

对于面临类似问题的任何人:

我使用 java http 客户端和附带的 jackson 库来执行我的请求。以下是获取请求的示例:

首先您需要来自 SensorContext 的一些数据:

context.config().get("sonar.host.url").orElse("http://localhost:9000")
context.config().get("sonar.login").orElse("")

使用这些值,您可以建立连接:

public static String get(String uri, String sonarLogin) throws IOException, InterruptedException {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request = HttpRequest.newBuilder()
          .uri(URI.create(uri))
          .header("Authorization", "Basic " + Base64.getEncoder().encodeToString((sonarLogin+":").getBytes()))
          .build();

    HttpResponse<String> response =
          client.send(request, BodyHandlers.ofString());
    return response.body();
}

为我的案例构建 URI 的位置:

private static String getUrl(String sonarUrl, String language, String tag) {
    StringBuilder builder = new StringBuilder(1024);
    builder.append(sonarUrl);
    if (!sonarUrl.endsWith("/")) {
        builder.append("/");
    }
    builder.append("api/rules/search?f=internalKey&ps=500");
    builder.append("&language=").append(language);
    builder.append("&tags=").append(tag);
    builder.append("&p=");
    return builder.toString();
}

响应字符串可以用 Jackson 处理,因为它是 JSON 格式。为此,您需要为查询创建匹配的 Java POJO。对于分页(p=...)需要添加。响应包含一个值总计,并且您的 p 值必须循环 0..x,其中 x= ((double)total/(double)ps).intValue();其中 ps 是页面大小 (<=500)

请注意:这是一个非常简单的例子。特别是,如果您有大量数据,则页面大小 (ps=500) 可能不适合您。如果您需要最小化响应,还有一种通过 protobuf 传输数据的方法。

© www.soinside.com 2019 - 2024. All rights reserved.