首页 > 解决方案 > 我无法从 Java 调用 SonarQube API 来搜索问题得到 410 错误

问题描述

嗨,我正在编写一个 OpenSource Springboot 微服务来从 SonarQube 获取问题 我使用 SonarQube 安装在 Docker 容器中 从浏览器登录后我成功调用: http://localhost:9001/api/issues/search?componentKeys=za.co.nico:RabbitMqPoc

我正在对一个 Java 类进行单元测试,我可以调用相同的 URL 并在需要它工作的地方获得 401 失败的身份验证

package za.co.nico.poc.services;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonarqube.ws.client.GetRequest;
import org.sonarqube.ws.client.HttpConnector;
import org.sonarqube.ws.client.WsClient;
import org.sonarqube.ws.client.WsClientFactories;
import org.sonarqube.ws.client.WsResponse;
import org.springframework.stereotype.Service;

/**
 * 
 * https://www.baeldung.com/java-http-request
 * 
 */
@Service
public class SonarServiceImpl implements SonarService {
    private static final Logger log = LoggerFactory.getLogger(SonarServiceImpl.class);
    
    private final String TOKEN="2ce06b3585c34141beeeb4005235337ba2bd135d"; 
    
    /**
     * https://programtalk.com/java-api-usage-examples/org.sonarqube.ws.client.WsClient/
     */
    @Override
    public String getData(String restUrl,String sonarEndPoint) {

        log.debug(" restUrl : "+restUrl+" sonarEndPoint : "+sonarEndPoint); // restUrl : http://localhost:9001/ sonarEndPoint : api/components/search_projects

        String login="admin";
        String password="admin";
        
        WsClient wsClient = WsClientFactories.getDefault().newClient(HttpConnector.newBuilder().url(restUrl).credentials(login, password).build());
        WsResponse response = wsClient.wsConnector().call(new GetRequest("api/authentication/validate"));
        String content = response.content();
        log.debug(""+response.isSuccessful());
        log.debug(""+response.code()); //200

        response = wsClient.wsConnector().call(new GetRequest("api/components/search_projects"));
        log.debug(""+response.isSuccessful());
        content = response.content();
        log.debug(""+response.code()); //401
        
        
        wsClient = WsClientFactories.getDefault().newClient(HttpConnector.newBuilder().url(restUrl).credentials("admin", "admin").build());
        response = wsClient.wsConnector().call(new GetRequest("local_ws_call/require_permission"));
        log.debug(""+response.isSuccessful());
        log.debug(""+response.code()); // 200

        wsClient = WsClientFactories.getDefault().newClient(HttpConnector.newBuilder().url(restUrl).credentials(login, password).build());
        response = wsClient.wsConnector().call(new GetRequest("api/rules/search"));
        log.debug(""+response.isSuccessful());
        log.debug(""+response.code()); // 401
        
        return "";
    }

}

请告知如何解决此问题

标签: javaapisonarqube

解决方案


401 错误仅表示您提供的身份验证凭据与预期不符。您似乎提供了“admin”和“admin”的用户名和密码,但我还看到您定义了一个未引用的“TOKEN”常量。我们不知道您如何配置您的 sonarqube 实例,或者实际需要什么凭据。根据我的经验,自动化脚本最好使用您似乎一直打算使用的“令牌”身份验证系统,但您根本没有正确传递它。


推荐阅读