在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

广告
将在 10 秒后关闭
bannerAds