Github API

前言

在使用Github作为远端仓库的时候,Github给我们提供了一套API接口,可以做非常多有趣的事,今天尝试使用其中的API来操作仓库文件,达到一个免费“数据库”的作用。

具体描述:

  1. 创建Github仓库,并传入一个文件作为“数据库”。
  2. 创建Token,用于访问和操作“数据库”
  3. 在安卓端,使用该Token,对“数据库”进行读写操作。

开始

在开始之前,请先确保已经申请Github账号和配置好本地Git环境,并具备基本的Git操作知识。如果还未接触过Git请先尝试学习一下简单教程。

一、 创建仓库

在Github页面创建一个公开仓库,起个名字比如:APITest:

image

本地创建一个新文件夹,创建两个文件data.jsonREADME.md
其中data.json就作为“数据库”文件使用,编辑此文件随便写点什么:

1
2
3
{
"key1": "value1"
}

然后,在本地建立仓库,并push到Github远端仓库:

1
2
3
4
5
git init
git add . --all
git commit -m "init"
git remote add origin git@github.com:Staray/APITest.git
git push -u origin master

至此仓库准备完毕

二、 验证接口

Github给我们提供了访问仓库文件的接口,测试下:

1
https://api.github.com/repos/Staray/APITest/contents/data.json

返回结果:

获取文件

分析下这个接口:
前面的https://api.github.com/repos/是固定的,接着Staray是我的Github账户名,APITest是刚刚创建的仓库名称,contents是固定格式,data.json是刚刚创建的文件名称,所以通用的格式如下:

1
https://api.github.com/repos/[用户名]/[仓库名]/contents/[文件名]

注意,这个地址一定要注意大小写!

这个json结构数据,包含了这个文件的一些关键性信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"name": "data.json",
"path": "data.json",
"sha": "1cdefd0d8236a42053cbc83945180258d9cdaded",
"size": 22,
"url": "https://api.github.com/repos/Staray/APITest/contents/data.json?ref=master",
"html_url": "https://github.com/Staray/APITest/blob/master/data.json",
"git_url": "https://api.github.com/repos/Staray/APITest/git/blobs/1cdefd0d8236a42053cbc83945180258d9cdaded",
"download_url": "https://raw.githubusercontent.com/Staray/APITest/master/data.json",
"type": "file",
"content": "ewogICJrZXkxIjogInZhbHVlMSIKfQ==\n",
"encoding": "base64",
"_links": {
"self": "https://api.github.com/repos/Staray/APITest/contents/data.json?ref=master",
"git": "https://api.github.com/repos/Staray/APITest/git/blobs/1cdefd0d8236a42053cbc83945180258d9cdaded",
"html": "https://github.com/Staray/APITest/blob/master/data.json"
}
}

需要注意的就是这个key:sha,每个仓库文件,都有对应的哈希值,如果修改该文件,哈希值就会变化,这个值是后面我们更新文件的唯一标识。
第二个需要注意的就是content,这个值记录的是文件内容的Base64编码结果,你可以直接通过Base64解码来获取到文件的内容。
第三个download_url,尝试访问这个地址,你就会直接拿到文件内容,如下所示:
raw-data-json

其他更多接口使用查看:
https://www.jianshu.com/p/a6779929fad2

三、 TOKEN申请

上面的文档中给出了多种认证方式:

认证方法一:Basic authentication
认证方法二:OAuth2 token
认证方法三:OAuth2 key/secret

根据我们要实现的功能,最合适的是TOKEN验证。

在Github页面,打开Setting页面:

setting

找到 Developer settings选项卡点击打开,进入Token页面

Token Page

点击Generate new token,在下拉框中选择Generate new token(classic),创建一个新的Token。

在创建页面,输入Note,设置期限,可以设置无过期,然后根据权限勾选token能操作的接口,这里我们需要操作仓库,至少要把repo勾选上:
Gen token

然后,点击下方的Generate token按钮。

就能看到生成的Token页面,注意,这个页面只有在这时显示一次,以后就再也看不到这个Token明文了,所以需要这时保存下来,然后一直使用,假如没有保存,重新执行上面的生成token步骤进行替换即可。

Token Content

四、 修改文件测试

下面介绍在安卓项目中修改仓库文件的实际测试,可以使用任何其他网络访问方式进行替换,比如在windows上使用Curl工具,PostMan工具等,原理都是一样。

比如使用Ok-go库进行网络访问,设置Header:

1
2
3
4
HttpHeaders headers = new HttpHeaders();
headers.put("Authorization", "token ghp_xxxxxxxxxxxxxxxxxxxxxx");
OkGo.getInstance().init(this)
.addCommonHeaders(headers);

代码里的token后面的内容使用申请的Token字符串进行替换。

然后,重点来了,修改文件内容需要以下操作,直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import android.util.Base64;

String json = "{\"key1\": \"value2\"}";
String base64Data = Base64.encodeToString(json.getBytes(StandardCharsets.UTF_8), Base64.DEFAULT);

/**
* 上传数据格式:
* {
* "message": "test",
* "content":
* "Y3JlYXRlIxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
* "sha": "5xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
* }
*/
JSONObject json = new JSONObject();
json.put("message", "test");
json.put("content", base64Data);
// shaStr,就是上面提到的文件哈希值。
json.put("sha", shaStr);

// 这个地址就是上面获取文件信息的地址,使用PUT方式进行文件更改
OkGo.<String>put("https://api.github.com/repos/Staray/APITest/contents/data.json")
.upJson(json)
.execute(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
Log.e("TAG", "success:" + response.body());
}
});

可以实际看到文件内容就被更改了:
put-result

再次访问Github API接口:

put-data-result

可以看到文件内容更改成功。

结语

有了这个接口,我们就可以实现一些简单的数据存储,这里使用的明文,可以进行加密处理,这样我们就可以在没有个人服务器的情况下,使用远端数据存储和同步数据了。


天街小雨润如酥,草色遥看近却无