业务需求:想通过接口获取码云仓库文件来做一些事情。
业务实现:
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、创建一个 RestTemplate 的 bean ,并在该对象里面添加拦截器
@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);
}
}