在Cloud9上安装PostgREST(学习JSON Web Token的相关内容时使用PostgREST)
首先从试用感受开始。
*※图片来源:https://github.com/begriffs/postgrest
我正在Cloud9上尝试使用PostgREST将PostgreSQL的JSON REST接口发布到互联网上(PostgREST简介请见此处)。PostgREST不仅在商业环境中被广泛使用,而且在本地尝试使用也非常方便。
与jq结合使用时会变成这样。
如果将在todos表中选择id列为2或更大的结果保存为response.json,那么可以执行以下操作:
$ curl http://localhost:3000/todos?id=gt.2 | jq '.' > response.json
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 144 0 144 0 0 1240 0 --:--:-- --:--:-- --:--:-- 1252
响应的JSON:
[
{
"id": 3,
"done": false,
"task": "IoTシステムの新規開発",
"due": null
},
{
"id": 4,
"done": false,
"task": "勝利の女神と商談。",
"due": null
}
]
PostgreSQL + PostgREST的第一印象就像是mongodb(或者更接近mongolab)。
然而,由于PostgreSQL既可作为SQL数据库,也可作为XML数据库和JSON数据库,所以从SQL的角度来看,PostgreSQL + PostgREST比mongolab > mongodb更好,甚至可以说PostgreSQL + PostgREST > mongolab > mongodb,这样的比较可能会让SQL有一定优势的人有所感触。
而且,在涉及速度和可扩展性的场景中,可以使用Redis作为KVS或Cassandra作为列向数据库的缓存,将其视为没有进行调优的NoSQL而不是PostgreSQL + PostgREST + RedisDB或Cassandra,并且我认为这可能是可行的。
尽管承认MongoDB在许多情况下非常有用,但如果能够熟练运用PostgreSQL + PostgREST + RedisDB(或Cassandra),那将成为一生受用的知识,这是我的期望。
假设你有一定地使用过PostgreSQL和Redis数据库(或Cassandra),
所以,接下来是关于PostgREST的介绍。
1. PostgREST二进制文件的部署
在这个例子中,我们需要从配置的形式中下载并解压postgrest的二进制文件(参考)。
对于Cloud9平台,我们需要下载适用于64位Ubuntu系统的文件。
wget https://github.com/begriffs/postgrest/releases/download/v0.4.3.0/postgrest-v0.4.3.0-ubuntu.tar.xz
unxz postgrest-v0.4.3.0-ubuntu.tar.xz
tar xvf postgrest-v0.4.3.0-ubuntu.tar
rm postgrest-v0.4.3.0-ubuntu.tar
由于Cloud9的存储空间有限,我先删除了tar文件。
建议将PostgreSQL升级至9.5以上。
PostgREST推荐使用9.5或更高版本的PostgreSQL,考虑到安全性。
尽管Cloud9默认使用9.3版本,但只需按照上述提到的方法稍加努力,就可以将Cloud9的Postgres升级到9.5或更高版本。
2. 创建PostgREST配置文件
如果无选项地运行tar创建的postgrest,则会显示指导。
~ $ ./postgrest
Missing: FILENAME
Usage: postgrest FILENAME
PostgREST 0.4.3.0 / create a REST API to an existing Postgres database
Available options:
-h,--help Show this help text
FILENAME Path to configuration file
Example Config File:
db-uri = "postgres://user:pass@localhost:5432/dbname"
db-schema = "public"
db-anon-role = "postgres"
db-pool = 10
server-host = "*4"
server-port = 3000
## base url for swagger output
# server-proxy-uri = ""
## choose a secret to enable JWT auth
## (use "@filename" to load from separate file)
# jwt-secret = "foo"
# secret-is-base64 = false
## limit rows in response
# max-rows = 1000
## stored proc to exec immediately after auth
# pre-request = "stored_proc_name"
参考本教程和原始教程,尝试创建自己的conf配置文件。
db-uri = "postgres://postgres:adminpass@localhost:5432/db1"
db-schema = "api"
db-anon-role = "postgres"
db-pool = 10
server-host = "*4"
server-port = 3000
首先由于在本地进行测试,决定允许具有完全权限的postgres用户连接至db1数据库的api模式。
3. PostgreSQL的配置
使用psql连接到PostgreSQL,并进行REST连接的设置。重点是按照教程的步骤进行。
首先需要做的是设置连接用户(在这里是postgres用户)的密码并创建数据库。
alter role postgres with password 'adminpass';
create database db1;
另外,在db1数据库中设置架构名称,并在该架构下创建表格。
db1=# create schema api;
db1=# create table api.todos (
id serial primary key,
done boolean not null default false,
task text not null,
due timestamptz
);
我尝试加入了日语的样本数据。
db1=# insert into api.todos (task) values
('finish tutorial 0'), ('pat self on back'), ('IoTシステムの新規開発');
4. 通过PostgREST进行连接。
準備が完了したので、PostgRESTを起動します。さらに、psqlも起動しておくとテストに便利です。
$ ./postgrest postgrest.conf &
$ psql db1
尝试从另一个终端使用curl进行GET/POST请求。
$ curl http://localhost:3000/todos
[{"id":1,"done":false,"task":"finish tutorial 0","due":null},{"id":2,"done":false,"task":"pat self on back","due":null},{"id":3,"done":false,"task":"IoTシステムの新規開発","due":null}]
$curl http://localhost:3000/todos -X POST \
-H "Content-Type: application/json" \
-d '{"task": "勝利の女神と商談。"}'
启动了psql的一方将会是这样的。
b1=# select * from api.todos;
id | done | task | due
----+------+-----------------------+-----
1 | f | finish tutorial 0 |
2 | f | pat self on back |
3 | f | IoTシステムの新規開発 |
(3 rows)
db1=# 127.0.0.1 - - [16/Sep/2017:12:05:42 +0000] "GET / HTTP/1.1" 200 - "" "curl/7.35.0"
127.0.0.1 - - [16/Sep/2017:12:06:28 +0000] "GET /todos HTTP/1.1" 200 - "" "curl/7.35.0"
127.0.0.1 - - [16/Sep/2017:12:07:54 +0000] "POST /todos HTTP/1.1" 201 - "" "curl/7.35.0"
db1=# select * from api.todos;
id | done | task | due
----+------+-----------------------+-----
1 | f | finish tutorial 0 |
2 | f | pat self on back |
3 | f | IoTシステムの新規開発 |
4 | f | 勝利の女神と商談。 |
(4 rows)
尽管能够很快了解到POST的结果似乎是好的,但是有一个要注意的地方,如果多次提交相同的消息,那么Postgres表中将会添加相应次数的行。这有点可怕(最好限制授予POST权限的情况)。
留下了什么印象
在将其发布到网络之前,我们必须认真考虑安全问题,然而,我仍然怀着期待继续前进。
请参考
PostgREST4.0的試用文章:
https://ekzemplaro.org/wordpress/postgrest/
PostgreSQL 数据库的全面安全性
https://www.ibm.com/developerworks/cn/opensource/library/os-postgresecurity/index.html