前言

最近有我的项目需要是通过gitlab的api获取其中的数据。来记录一下我的踩坑的过程。
首先先尝试了获取users数据,即所有用户的数据。

这里是gitlab官网API文档 https://docs.gitlab.com/ee/ap...

这里说一下我刚开始的做法和老师倡议的做法。

最开始的做法

1. 获取Admin access token

首先咱们须要获取gitlab的Admin access token, 并且在申请的时候附带这个token,gitlab能力认证咱们的身份并返回数据。

1.登录 GitLab。 2.登录后,点击右上角的头像图标而后抉择 Preferences。

3.在 access token 界面就能够新建token了。

当你是group的管理员之后,就能够通过该token获取users了。

2.应用spring boot单元测试发动申请

这里我应用了apache发动http申请,并应用了fastjson解决申请后所返回的json数据。

<dependency>  <groupId>org.apache.httpcomponents</groupId>  <artifactId>httpclient</artifactId>  <version>4.5.9</version></dependency> <dependency>    <groupId>com.alibaba</groupId>    <artifactId>fastjson</artifactId>    <version>1.2.76</version></dependency>

以下是我测试的代码。来解释一下:

  1. 首先定义你的要申请的url,格局如代码。也能够看官网文档。
  2. 构建Http申请类,并设置参数。参数必须要有private_token。这里我加的 without_project_bots能够过滤机器人user。
  3. 应用execute函数发动get申请,并接管返回的json数据。
  4. 从json数组转换成实体数组

这样就取得了咱们须要的数据。

@Test  void getUsers() throws IOException, URISyntaxException {    String url = "https://your gitlab address/api/v4/users";    CloseableHttpClient httpclients = HttpClients.createDefault();    HttpGet httpGet = new HttpGet(url);    // 设置参数信息    URI uri = new URIBuilder(httpGet.getURI())            .addParameter("private_token", "your amind token")            .addParameter("without_project_bots", "true")            .build();    ((HttpRequestBase) httpGet).setURI(uri);    // 发动申请    CloseableHttpResponse response = httpclients.execute(httpGet);    // 解决数据    HttpEntity httpEntity = (HttpEntity) response.getEntity();    String result =  EntityUtils.toString(httpEntity,"UTF-8");    // 从json转换成实体    final ObjectMapper objectMapper = new ObjectMapper();    User[] langList = objectMapper.readValue(result, User[].class);    logger.debug(String.valueOf(langList));    response.close();  }

期间我遇到的问题

1. java须要增加证书

因为咱们发动的申请地址是HTTPS的,而https是对链接加了平安证书SSL的,如果服务器中没有相干链接的SSL证书,它就不可能信赖那个链接, 就会报sun.security.validator.ValidatorException谬误。

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

最开始我是把证书增加到本地中的,增加办法大略参考了如下博客
https://www.cnblogs.com/zoro-...

这样就把证书增加到了本地的java密钥库中。

然而这样只有本地可能失常应用这个我的项目。因为在并没有把证书增加到我的项目中。所以这也阐明了这种办法并不普适。

所以咱们须要把证书放在src/main/resourse中,部署https。上面我会说一下如何增加。

2. 没有配置数据源

Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]

因为我只是在单元测试中测试,我的项目刚初始化,并没有连贯数据库,也就是并没有配置数据源。

所以因为没有向 Spring Boot 传递足够的数据来配置数据源,导致产生了该报错。

所以,如果咱们临时不须要数据源,就能够应用exclude={DataSourceAutoConfiguration.class}主动配置。 这样就能够解决报错

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})public class NonlycodeApplication {}

3. json数据的属性多于实体的属性

在我申请到数据后,能够看到gitlab给咱们返回来的数据有很多。有theme_id, note,is_admin等信息。


然而, 我定义的实体中目前只定义了几条须要的信息,比方id ,name,username等信息。

public class User implements Serializable {  private static final long serialVersionUID = 1L;  @Id  private Long id;  private String email = "";  private Integer following = 0;  private Integer followers = 0;  private String name = "";  private  String password = "yunzhi";  @Column(nullable = false, unique = true)  private String username;

在json转化数据的时候,遇到这种状况就会报错。并且报错说:not marked as ignorable。

所以咱们须要增加正文,把不须要的数据给疏忽掉。

我的解决办法是增加 @JsonIgnoreProperties(ignoreUnknown = true)
最初报错隐没。

@JsonIgnoreProperties(ignoreUnknown = true)@Entitypublic class User implements Serializable {

应用RestTemplate通过证书认证拜访https

传统状况下在java代码里拜访restful服务,个别应用Apache的HttpClient。如同我下面的代码。不过此种办法应用起来太过繁琐。spring提供了一种简略便捷的模板类来进行操作,这就是RestTemplate。

1. 获取证书

我参考了这篇文章来生成自签名证书。
https://www.baeldung.com/spri...

或者能够下载网站,参考这篇文章来创立密钥库
https://fullstackdeveloper.gu...

把生成的文件导入到我的项目resourses/keystore中

2. 配置application.yml

填写一下本人配置的password和alias别名等

server:  ssl:    key-store-type: PKCS12    key-store: classpath:keystore/baeldung.p12    key-store-password: changeit    key-alias: baeldung  port: 8443spring:  security:    user:      name: root      password: 1234

4. 配置restTemplate

配置restTemplate,使其加载我的项目中的证书

  1. 新建CustomConfiguration类
  2. 重写restTemplate()函数

留神一下本人的文件名,以及方才本人设置的key-store明码

@Configurationpublic class CustomConfiguration {  @Bean  RestTemplate restTemplate() throws Exception {    SSLContext sslContext = new SSLContextBuilder()            .loadTrustMaterial(new URL("file:src/main/resources/keystore/baeldung.p12"), "changeit".toCharArray()).build();    SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext);    HttpClient httpClient = HttpClients.custom()            .setSSLSocketFactory(socketFactory)            .build();    HttpComponentsClientHttpRequestFactory factory =            new HttpComponentsClientHttpRequestFactory(httpClient);    return new RestTemplate(factory);  }}

3. 编写代码

controller层:

@RestController@RequestMapping("user")public class UserController {  @Autowired  UserService userService;  @GetMapping("/getUsers")  @JsonView(GetUsersJsonView.class)  public User[] getUsers() throws JsonProcessingException {    return  this.userService.getUsers();  }  public class GetUsersJsonView {  }}

service层:
留神填写本人的url和token。 逻辑跟之前的代码差不多。

@Override  public User[] getUsers() throws JsonProcessingException {    String url = "https://your gitlab address /api/v4/users/" +            "?private_token={private_token}&without_project_bots={without_project_bots}";    final Map<String, String> variables = new HashMap<>();    variables.put("private_token", "your token");    variables.put("without_project_bots", "true");    RestTemplate restTemplate = new RestTemplate();    String response = restTemplate.getForObject(url, String.class, variables);    // 从json转换成实体    final ObjectMapper objectMapper = new ObjectMapper();    User[] userList = objectMapper.readValue(response, User[].class);    return userList;  }

4. url拜访

可能是因为spring security, 须要登录。 咱们输出application.yml中配置好的账号密码

4. 后果

可能是jsonView没配置好,页面显示空信息。之后再弄一下。

然而通过打断点打印, 显示成绩获取到了gitlab中的users信息。