Java 获取 GitHub PR 消息
项目地址:链接
使用 GitHub API 获取 PR
工具包:
- Apache HttpClient 用来发起 HTTP 请求
- Apache Commons IO 将返回的字节流转化成字符串
- Jackson Databind 将返回的字符串解析转化成所需对象
访问 GitHub API
访问 Github API 文档,找到 List pull requests 该项,根据 API 说明,应当使用 GET 方法,路径中还需要带上 owner 和 repo 参数,还需要设置 request header 中的 accept 为 appliccation/vnd.github.v3+json
,这样就建立了一个正确的请求
编写代码
创建一个类来封装获取到的信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14static class GitHubPullRequest {
// Pull request的编号
int number;
// Pull request的标题
String title;
// Pull request的作者的 GitHub 用户名
String author;
GitHubPullRequest(int number, String title, String author) {
this.number = number;
this.title = title;
this.author = author;
}
}新建一个方法,使用 HttpClient 工具包发起 HTTP 请求
1
2
3
4CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("https://api.github.com/repos/" + repo + "/pulls");
httpGet.setHeader("Accept", "application/vnd.github.v3+json");
CloseableHttpResponse response = httpclient.execute(httpGet);首先创建一个默认的可关闭的客户端,使用 HttpGet 创建一个 GET 请求,repo 是我们要接收的参数。再刚才创建的 GET 请求中设置他的请求头信息,与 GitHub 规定的 API 一致。然后使用刚才创建的客户端,去执行 get 请求,将返回的结果用 CloseableHttpResponse 接收。
由于返回的结果是字节流,因此我们需要把字节流转换成我们需要的类型
1
2
3HttpEntity responseEntity = response.getEntity();
InputStream inputStream = responseEntity.getContent();
String result = IOUtils.toString(inputStream, "UTF-8");使用
getEntity()
方法获取返回的 body 实体信息,获取到的实体信息调用getContent()
方法获取内容,接着使用 IOUtils 工具把获取的内容从字节流以 UTF-8 的格式转化为字符串。把字符串转化成 json 对象或实体对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14ObjectMapper objectMapper = new ObjectMapper();
JsonNode node = objectMapper.readTree(result);
List<GitHubPullRequest> gitHubPullRequests = new ArrayList<>();
int number;
String title;
String author;
for (int i = 0; i < node.size(); i++) {
number = node.get(i).get("number").asInt();
title = node.get(i).get("title").asText();
author = node.get(i).get("user").get("login").asText();
gitHubPullRequests.add(new GitHubPullRequest(number, title, author));
}使用 Jackson 工具,以树的形式反序列化 json 字符串得到 JsonNode,然后使用 for 循环将我们需要的数据封装到GitHubPullRequest 对象中,即可。
解析 HTML 获取 PR
工具包:
- Apache HttpClient 用来发起 HTTP 请求
- Apache Commons IO 将返回的字节流转化成字符串
- Jsoup 将 html 字符串转化为 document
找到要获取的仓库 PR 地址,发起请求
1 |
|
发起请求并执行请求,获得返回的 response
1 |
|
获取返回的数据中,body的内容,并把它转化成字符串。
1 |
|
由于得到的是 html 字符串,使用 Jsoup 解析工具解析成 Document 类型。
1 |
|
使用 document 的 css 选择器,获取页面中的元素。此处可以根据具体页面采用不同的选择器。
1 |
|
根据元素之间的层级关系,拿到对应元素的信息,把信息封装到 GitHubPullRequest 类中存储。一个简单的 HTML 爬虫实现。
使用第三方 SDK 获取 PR
工具包:
- Apache HttpClient 用来发起 HTTP 请求
- Apache Commons IO 将返回的字节流转化成字符串
- Jackson Databind 将返回的字符串解析转化成所需对象