使用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 进行交互。

这里注意,Github对于API的访问频率是有限制的。如果未认证,那么同一个ip一小时只能发送60个请求。经过认证,可以提供访问频率。可以参考github官方说明-> GithubAPI访问频率限制

二、使用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查询

 private  static <T> T queryBean(String url, Class<T> c) throws Exception {String json = httpGet(url);return JsonUtil.string2Object(json, c);}private static <C extends Collection<E>, E>  E queryList(String url, Class<E> c) throws Exception {String json = httpGet(url);return (E) JsonUtil.string2Collection(json, ArrayList.class, c);}private static String httpGet(String url) throws IOException {CloseableHttpClient client = HttpClients.createDefault();CloseableHttpResponse response = client.execute(new HttpGet(url));HttpEntity httpEntity = response.getEntity();String json = EntityUtils.toString(httpEntity);return json;}

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

2.4jackson反序列化工具

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

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.ArrayType;
import com.fasterxml.jackson.databind.type.TypeFactory;import java.io.StringWriter;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;public final class JsonUtil {private static TypeFactory typeFactory = TypeFactory.defaultInstance();private static final ObjectMapper MAPPER = new ObjectMapper();static {MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);MAPPER.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);MAPPER.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);MAPPER.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);}public static String object2String(Object object) {StringWriter writer = new StringWriter();try {MAPPER.writeValue(writer, object);}catch(Exception e) {return null;}return writer.toString();}@SuppressWarnings("unchecked")public static <T> T string2Object(String json, Class<T> clazz) {JavaType type = typeFactory.constructType(clazz);try {return (T) MAPPER.readValue(json, type);} catch(Exception e) {return null;}}public static String map2String(Map<?,?> map) {StringWriter writer = new StringWriter();try {MAPPER.writeValue(writer, map);} catch(Exception e) {return null;}return writer.toString();}public static Map<String, Object> string2Map(String json) {JavaType type = typeFactory.constructMapType(HashMap.class, String.class, Object.class);try {return MAPPER.readValue(json, type);} catch(Exception e) {return null;}}public static <K, V> Map<K, V> string2Map(String json, Class<K> keyClazz, Class<V> valueClazz) {JavaType type = typeFactory.constructMapType(HashMap.class, keyClazz, valueClazz);try {return MAPPER.readValue(json, type);} catch(Exception e) {return null;}}@SuppressWarnings("unchecked")public static <T> T[] string2Array(String json, Class<T> clazz) {ArrayType type = typeFactory.constructArrayType(clazz);try {return (T[]) MAPPER.readValue(json, type);} catch(Exception e) {return null;}}public static <C extends Collection<E>, E> C string2Collection(String json, Class<C> collectionType,Class<E> elemType) {JavaType type = typeFactory.constructCollectionType(collectionType, elemType);try {return MAPPER.readValue(json, type);} catch(Exception e) {return null;}}}

2.5相关javabean定义

这里使用了lombok简化bean编写

import lombok.Data;@Data
public class ProjectView {private String html_url;private boolean fork;private String description;// 开发语言private String language;// 点赞数private int stargazers_count;// fork数private int forks_count;}
import lombok.Data;@Data
public class UserView {// github主页private String html_url;// 公有仓库数量private int public_repos;private int followers;
}

2.6代码示例

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

2.7运行截图 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/521422.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【博士每天一篇文献-实验】Is a Modular Architecture Enough?

阅读时间&#xff1a;2023-11-26 1 介绍 年份&#xff1a;2022 作者&#xff1a;Sarthak Mittal&#xff0c;Yoshua Bengio&#xff0c;蒙特利尔大学 期刊&#xff1a; Advances in Neural Information Processing Systems 引用量&#xff1a;22 这篇论文探讨了模块化架构在机…

Java中SpringBoot四大核心组件是什么

一、Spring Boot Starter 1.1 Starter的应用示例 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency><groupId>org.mybatis.sprin…

php反序列化-字符逃逸看这一篇就够了

反序列化的特性 <?php /* $_SESSION["user"] guest; $_SESSION[function] highlight_file; $_SESSION[img] base64_encode(/d0g3_fllllllag); //d0g3_f1ag.php $serialize_info serialize($_SESSION);echo $serialize_info;*/$str a:3:{s:4:"user&quo…

unity学习(51)——服务器三次注册限制以及数据库化角色信息6--完结

同一账号只写第一次&#xff0c;不同账号第一次爆炸 &#xff0c;就因为下面部分得到逻辑有问题 修改后的代码如下&#xff1a;1.成功完成角色注册信息的数据库化记录。2.每个账号上限3个角色。3.角色是可以重名的&#xff0c;但是角色的id不会重名。 internal class UserCach…

酷克数据荣获粤港澳大湾区金融创新成果“特优解决方案”奖

近日&#xff0c;“第二届金融创新优秀应用案例与解决方案技术成果评定”正式揭晓&#xff0c;酷克数据提交的“HashData云原生金融信创数据仓库”入选特优解决方案&#xff0c;成为数据治理与数据平台类目中唯一的厂商方案。 本次评定历时5个多月&#xff0c;共257个项目参与申…

为什么TikTok视频0播放?账号权重提高要重视

许多TikTok账号运营者都会遇到一个难题&#xff0c;那就是视频要么播放量很低&#xff0c;要么0播放&#xff01;不管内容做的多好&#xff0c;最好都是竹篮打水一场空&#xff01;其实你可能忽略了一个问题&#xff0c;那就是账号权重。下面好好跟大家讲讲这个东西&#xff01…

《拓跋氏后裔的诅咒》——献给奋斗中的女性

近日&#xff0c;一部描绘北方农村女性成长与觉醒的长篇小说《拓跋氏后裔的诅咒》引起了广泛关注。这部作品由北京儿童医院的医生张鹏飞历时四年精心创作&#xff0c;由作家出版社出版。小说通过一个具有代表性的北方农村女性的视角&#xff0c;展现了现代社会中女性地位的提升…

直播相机,AI纪元!云犀首款AI直播相机重磅发布!

3月7日晚&#xff0c;云犀重磅发布首款AI直播相机-云犀智瞳Pro&#xff01;据悉该相机内置了云犀首款AI直播调参大模型&#xff0c;能够通过AI分析智能调节直播间参数&#xff0c;赋予直播间画面AI智能调控能力。 云犀AI直播相机&#xff0c;让直播更简单 此次云犀AI直播相机的…

Mysql 学习(十五)redo 日志

redo 日志 什么是redo日志&#xff1f;在说这个之前我们先来想一个场景&#xff0c;在访问磁盘的页面之前&#xff0c;我们会先把页面缓存到Buffer Pool之后&#xff0c;才会访问。写页面的时候也会先将buffer pool中的页面修改之后&#xff0c;然后在某个时机才会刷新到磁盘中…

Linux基础IO【 详 解 】

文章目录 C语言文件IOC语言文件接口汇总默认打开的三个流 系统文件IOopenclosewriteread 文件描述符fd文件描述符的分配规则重定向重定向的本质dup2 FILEFILE当中的文件描述符FILE当中的缓冲区 理解文件系统初识inode磁盘分区与格式化介绍 软硬链接软链接硬链接软硬链接的区别 …

国家妇女节放假是法定的假日

在这个充满活力和希望的春天&#xff0c;我们迎来了一个特殊的节日——国家妇女节。这是一个属于所有女性的节日&#xff0c;是一个庆祝女性成就、关爱女性权益的时刻。在这个特殊的日子里&#xff0c;我们不禁要问&#xff1a;国家妇女节放假是法定假日吗&#xff1f;让我们一…

从新能源汽车行业自动驾驶技术去看AI的发展未来趋势

自动驾驶汽车关键技术主要包括环境感知、精准定位、决策与规划、控制与执行、高精地图与车联网V2X以及自动驾驶汽车测试与验证技术等。 &#x1f413; 自动驾驶技术 这是AI在汽车行业中应用最广泛的领域之一。自动驾驶技术利用AI算法和传感器来感知环境、识别障碍物&#xff0c…