当前位置:   article > 正文

使用GitHub API 查询开源项目信息

使用GitHub API 查询开源项目信息

一、GitHub API介绍

GitHub API 是一组 RESTful API 接口,用于与 GitHub 平台进行交互。通过使用 GitHub API,开发人员可以访问和操作 GitHub 平台上的各种资源,如仓库、提交记录、问题等。

GitHub API 提供了多种功能和端点,以满足开发人员的需求。一些常用的功能包括:

  1. 获取用户信息:可以通过 API 获取用户的基本信息、关注列表、仓库列表等。
  2. 管理仓库:可以通过 API 创建仓库、编辑仓库属性、获取仓库的提交记录等。
  3. 问题和讨论:可以通过 API 创建问题、获取问题列表、参与讨论等。
  4. 用户认证和授权:可以通过 API 进行用户的认证和授权,以获取访问私有资源的权限。
  5. 搜索:可以通过 API 进行代码搜索、问题搜索、用户搜索等。

GitHub API 使用标准的 HTTP 协议进行通信,并返回 JSON 格式的数据。开发人员可以使用任何支持 HTTP 请求的编程语言来与 GitHub API 进行交互。

二、使用java进行项目信息查询

2.1获取用户、仓库基础信息API说明

https://api.github.com/users/{user}
查询用户数据
https://api.github.com/users/{user}/repos
查询仓库数据
https://api.github.com/repos/{user}/{repos}
查询项目

以上接口可以填写具体参数,直接在浏览器进行访问。 

2.2主要用到的第三方工具库

工具名作用maven依赖
httpclienthttp查询
<dependency>
  <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.4</version>
</dependency>
jacksonjson反序列化
<dependency>
 <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.12.1</version>
</dependency>

2.3使用httpclient查询

  1. private static <T> T queryBean(String url, Class<T> c) throws Exception {
  2. String json = httpGet(url);
  3. return JsonUtil.string2Object(json, c);
  4. }
  5. private static <C extends Collection<E>, E> E queryList(String url, Class<E> c) throws Exception {
  6. String json = httpGet(url);
  7. return (E) JsonUtil.string2Collection(json, ArrayList.class, c);
  8. }
  9. private static String httpGet(String url) throws IOException {
  10. CloseableHttpClient client = HttpClients.createDefault();
  11. CloseableHttpResponse response = client.execute(new HttpGet(url));
  12. HttpEntity httpEntity = response.getEntity();
  13. String json = EntityUtils.toString(httpEntity);
  14. return json;
  15. }

上述代码主要有两个查询函数,一个查询单个实体,一个查询实体列表。

2.4jackson反序列化工具

需要注意的是,由于GitHub API返回的查询结果数据非常全面,但我们的代码可能只需要部分字段(需要什么字段自行添加),在使用jackson进行反序列化的时候,应该设置忽略没有申明的字段。

  1. import com.fasterxml.jackson.annotation.JsonAutoDetect;
  2. import com.fasterxml.jackson.annotation.JsonInclude;
  3. import com.fasterxml.jackson.annotation.PropertyAccessor;
  4. import com.fasterxml.jackson.databind.DeserializationFeature;
  5. import com.fasterxml.jackson.databind.JavaType;
  6. import com.fasterxml.jackson.databind.ObjectMapper;
  7. import com.fasterxml.jackson.databind.type.ArrayType;
  8. import com.fasterxml.jackson.databind.type.TypeFactory;
  9. import java.io.StringWriter;
  10. import java.util.Collection;
  11. import java.util.HashMap;
  12. import java.util.Map;
  13. public final class JsonUtil {
  14. private static TypeFactory typeFactory = TypeFactory.defaultInstance();
  15. private static final ObjectMapper MAPPER = new ObjectMapper();
  16. static {
  17. MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);
  18. MAPPER.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
  19. MAPPER.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
  20. MAPPER.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
  21. MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  22. }
  23. public static String object2String(Object object) {
  24. StringWriter writer = new StringWriter();
  25. try {
  26. MAPPER.writeValue(writer, object);
  27. }catch(Exception e) {
  28. return null;
  29. }
  30. return writer.toString();
  31. }
  32. @SuppressWarnings("unchecked")
  33. public static <T> T string2Object(String json, Class<T> clazz) {
  34. JavaType type = typeFactory.constructType(clazz);
  35. try {
  36. return (T) MAPPER.readValue(json, type);
  37. } catch(Exception e) {
  38. return null;
  39. }
  40. }
  41. public static String map2String(Map<?,?> map) {
  42. StringWriter writer = new StringWriter();
  43. try {
  44. MAPPER.writeValue(writer, map);
  45. } catch(Exception e) {
  46. return null;
  47. }
  48. return writer.toString();
  49. }
  50. public static Map<String, Object> string2Map(String json) {
  51. JavaType type = typeFactory.constructMapType(HashMap.class, String.class, Object.class);
  52. try {
  53. return MAPPER.readValue(json, type);
  54. } catch(Exception e) {
  55. return null;
  56. }
  57. }
  58. public static <K, V> Map<K, V> string2Map(String json, Class<K> keyClazz, Class<V> valueClazz) {
  59. JavaType type = typeFactory.constructMapType(HashMap.class, keyClazz, valueClazz);
  60. try {
  61. return MAPPER.readValue(json, type);
  62. } catch(Exception e) {
  63. return null;
  64. }
  65. }
  66. @SuppressWarnings("unchecked")
  67. public static <T> T[] string2Array(String json, Class<T> clazz) {
  68. ArrayType type = typeFactory.constructArrayType(clazz);
  69. try {
  70. return (T[]) MAPPER.readValue(json, type);
  71. } catch(Exception e) {
  72. return null;
  73. }
  74. }
  75. public static <C extends Collection<E>, E> C string2Collection(String json, Class<C> collectionType,
  76. Class<E> elemType) {
  77. JavaType type = typeFactory.constructCollectionType(collectionType, elemType);
  78. try {
  79. return MAPPER.readValue(json, type);
  80. } catch(Exception e) {
  81. return null;
  82. }
  83. }
  84. }

2.5相关javabean定义

这里使用了lombok简化bean编写

  1. import lombok.Data;
  2. @Data
  3. public class ProjectView {
  4. private String html_url;
  5. private boolean fork;
  6. private String description;
  7. // 开发语言
  8. private String language;
  9. // 点赞数
  10. private int stargazers_count;
  11. // fork数
  12. private int forks_count;
  13. }
  1. import lombok.Data;
  2. @Data
  3. public class UserView {
  4. // github主页
  5. private String html_url;
  6. // 公有仓库数量
  7. private int public_repos;
  8. private int followers;
  9. }

2.6代码示例

  1. public static void main(String[] args) throws Exception {
  2. String user = "kingston-csj";
  3. String project = "jforgame";
  4. // 查询用户数据
  5. String url1 = "https://api.github.com/users/{username}".replace("{username}", user);
  6. System.out.println(queryBean(url1, UserView.class));
  7. // 查询仓库数据
  8. String url2 = "https://api.github.com/users/{username}/repos".replace("{username}", user);
  9. System.out.println(queryList(url2, ProjectView.class));
  10. // 查询具体仓库
  11. String url3 = "https://api.github.com/repos/{username}/{reposname}".replace("{username}", user).replace("{reposname}",project);
  12. System.out.println(queryBean(url3, ProjectView.class));
  13. }

2.7运行截图 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/193694
推荐阅读
相关标签
  

闽ICP备14008679号