前言
最近有我的项目需要是通过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>
以下是我测试的代码。来解释一下:
- 首先定义你的要申请的url,格局如代码。也能够看官网文档。
- 构建Http申请类,并设置参数。参数必须要有private_token。这里我加的 without_project_bots能够过滤机器人user。
- 应用execute函数发动get申请,并接管返回的json数据。
- 从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,使其加载我的项目中的证书
- 新建CustomConfiguration类
- 重写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信息。