码云仓库文件通过接口获取,并实现token配置化流程

710 阅读2分钟

业务需求:想通过接口获取码云仓库文件来做一些事情。

业务实现

1、首先需要先去码云的个人页面去注册一个三方应用,注册完后,参考以下官方文档,去获取 token

码云三方应用文档:gitee oauth

2、当我们获取到 token, 需要保存到 cookie 里面,这样每次请求的时候,都会默认将 cookie 添加到 headers 里。

document.cookie="token=***********************"

3、通过拦截 HttpServletRequest 来获取 token,并在 HttpRequest 上添加 token 参数。

  • 配置这个的作用:是实现 RestTemplate 请求,不需要每次都添加 token 参数

配置文件:

@ControllerAdvice
public class HttpServletConfig implements ServletRequestListener, ClientHttpRequestInterceptor {
    
    private static String token;

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if ("token".equals(cookie.getName())) {
                    token = cookie.getValue();
                }
            }
        }
    }


    @Override
    @SneakyThrows
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) {
        if (token != null) {
            HttpRequestConfig httpRequestConfig = new HttpRequestConfig();
            httpRequestConfig.setHttpHeaders(request.getHeaders());
            httpRequestConfig.setMethodValue(request.getMethodValue());
            // 追加 token ,因为这里只有一个 gitee 的 RestTemplate 请求,所以就不过滤了
            URI uri = new URI(String.format("%s?access_token=%s", request.getURI(), token));
            httpRequestConfig.setUri(uri);
            return execution.execute(httpRequestConfig, body);
        }
        return execution.execute(request, body);
    }
}

4、因为 HttpRequest 不能直接 set uri,所以需要创建一个 HttpRequestConfig 类来实现 HttpRequest 接口,这样就可以添加 setURI 方法了

@Data
public class HttpRequestConfig implements HttpRequest {
    private URI uri;
    private HttpHeaders httpHeaders;
    private String methodValue;

    @Override
    public String getMethodValue() {
        return methodValue;
    }

    @Override
    public URI getURI() {
        return uri;
    }

    @Override
    public HttpHeaders getHeaders() {
        return httpHeaders;
    }
}

5、创建一个 RestTemplatebean ,并在该对象里面添加拦截器

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate() {
        RestTemplate template = new RestTemplate();
        template.setInterceptors(Collections.singletonList(new HttpServletConfig()));
        return template;
    }
}

6、最后通过调用码云的 open api 就可以实现接口无 token 调用了

@Service
public class GiteeService {

    // 用户名
    private final String owner = "xxx";
    
    // 仓库名称
    private final String repo = "yyy";

    @Autowired
    private RestTemplate restTemplate;

    // 获取文件内容
    public String getFileContent(String path) {
        String url = String.format("https://gitee.com/api/v5/repos/%s/%s/raw%s", owner, repo, path);
        return restTemplate.getForObject(url, String.class);
    }

    // 获取路径下的所有文件信息
    public Object getFiles(String path) {
        String url = String.format("https://gitee.com/api/v5/repos/%s/%s/contents%s", owner, repo, path);
        return restTemplate.getForObject(url, String.class);
    }
}