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,这样就建立了一个正确的请求

image.png

编写代码

  1. 创建一个类来封装获取到的信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    static 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;
    }
    }
  2. 新建一个方法,使用 HttpClient 工具包发起 HTTP 请求

    1
    2
    3
    4
    CloseableHttpClient 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 接收。

  3. 由于返回的结果是字节流,因此我们需要把字节流转换成我们需要的类型

    1
    2
    3
     HttpEntity responseEntity = response.getEntity();
    InputStream inputStream = responseEntity.getContent();
    String result = IOUtils.toString(inputStream, "UTF-8");

    使用 getEntity() 方法获取返回的 body 实体信息,获取到的实体信息调用 getContent() 方法获取内容,接着使用 IOUtils 工具把获取的内容从字节流以 UTF-8 的格式转化为字符串。 

  4. 把字符串转化成 json 对象或实体对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ObjectMapper 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
2
3
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("https://github.com/" + repo + "/pulls");
CloseableHttpResponse response = httpclient.execute(httpGet);

发起请求并执行请求,获得返回的 response

1
2
3
HttpEntity responseEntity = response.getEntity();
InputStream inputStream = responseEntity.getContent();
String result = IOUtils.toString(inputStream, "UTF-8");

获取返回的数据中,body的内容,并把它转化成字符串。

1
Document doc = Jsoup.parse(result);

由于得到的是 html 字符串,使用 Jsoup 解析工具解析成 Document 类型。

1
ArrayList<Element> elements = doc.select(".js-issue-row");

使用 document 的 css 选择器,获取页面中的元素。此处可以根据具体页面采用不同的选择器。

1
2
3
4
5
6
7
8
9
10
11
int number;
String title;
String author;
List<GitHubPullRequest> gitHubPullRequests = new ArrayList<>();
for (Element e : elements) {
title = e.child(0).child(1).child(0).text();
author = e.child(0).child(1).child(3).child(0).child(1).text();
String[] str = e.child(0).child(1).child(3).child(0).text().split(" ");
number = Integer.parseInt(str[0].substring(1));
gitHubPullRequests.add(new GitHubPullRequest(number, title, author));
}

根据元素之间的层级关系,拿到对应元素的信息,把信息封装到 GitHubPullRequest 类中存储。一个简单的 HTML 爬虫实现。

使用第三方 SDK 获取 PR

工具包:

  • Apache HttpClient 用来发起 HTTP 请求
  • Apache Commons IO 将返回的字节流转化成字符串
  • Jackson Databind 将返回的字符串解析转化成所需对象

Java 获取 GitHub PR 消息
http://wszzf.top/2021/05/11/Java 获取 GitHub PR 信息/
作者
Greek
发布于
2021年5月11日
许可协议