我想从我的
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 并创建自己的连接并解析结果...但如果有兼容的方式,这将是很大的开销。
致以诚挚的问候
延斯
对于面临类似问题的任何人:
我使用 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 传输数据的方法。