pg_net: 异步网络
caution
pg_net的API还处于beta阶段。函数签名可能会改变。
pg_net是一个PostgreSQL扩展,为异步网络暴露了一个SQL接口,重点是可扩展性和用户体验。
它与http
扩展的不同之处在于,它默认是异步的。这使得它在阻塞函数(如触发器)中很有用。
用法
启用扩展功能
- 进入仪表板中的数据库页面。
- 点击侧边栏中的扩展.
- 搜索 "pg_net "并启用该扩展。
http_get
{#http_get}#
创建一个HTTP GET请求,返回该请求的ID。在事务提交之前,HTTP请求不会被启动。
签名
caution
这是一个Postgres安全定义函数。
1net.http_get(
2 -- url for the request
3 url text,
4 -- key/value pairs to be url encoded and appended to the `url`
5 params jsonb default '{}'::jsonb,
6 -- key/values to be included in request headers
7 headers jsonb default '{}'::jsonb,
8 -- WARNING: this is currently ignored, so there is no timeout
9 -- the maximum number of milliseconds the request may take before being cancelled
10 timeout_milliseconds int default 1000
11)
12 -- request_id reference
13 returns bigint
14
15 strict
16 volatile
17 parallel safe
18 language plpgsql
使用方法
1select net.http_get('https://news.ycombinator.com') as request_id;
2request_id
3----------
4 1
5(1 row)
在触发了http_get
之后,使用http_get_result
来获取请求的结果。
http_post
{#http_post}#
创建一个带有JSON主体的HTTP POST请求,返回请求的ID。HTTP请求在事务提交之前不会被启动。
主体的字符集编码与数据库的server_encoding
设置一致。
签名
caution
这是一个Postgres安全定义函数。
1net.http_post(
2 -- url for the request
3 url text,
4 -- body of the POST request
5 body jsonb default '{}'::jsonb,
6 -- key/value pairs to be url encoded and appended to the `url`
7 params jsonb default '{}'::jsonb,
8 -- key/values to be included in request headers
9 headers jsonb default '{"Content-Type": "application/json"}'::jsonb,
10 -- WARNING: this is currently ignored, so there is no timeout
11 -- the maximum number of milliseconds the request may take before being cancelled
12 timeout_milliseconds int default 1000
13)
14 -- request_id reference
15 returns bigint
16
17 volatile
18 parallel safe
19 language plpgsql
使用方法
1select
2 net.http_post(
3 url:='https://httpbin.org/post',
4 body:='{"hello": "world"}'::jsonb
5 ) as request_id;
6request_id
7----------
8 1
9(1 row)
在触发了http_post
之后,使用http_get_result
来获得请求的结果。
http_collect_response
{#http_collect_response}#
给出一个request_id
参考,检索响应。
当async:=false
被设置时,建议将statement_timeout设置为调用者愿意等待的最大时间,以防止响应填充缓慢。
签名
caution
这是一个Postgres安全定义函数。
1net.http_collect_response( 2 -- request_id reference 3 request_id bigint, 4 -- when `true`, return immediately. when `false` wait for the request to complete before returning 5 async bool default true 6) 7 -- http response composite wrapped in a result type 8 returns net.http_response_result 9 10 strict 11 volatile 12 parallel safe
使用方法
caution
net.http_collect_response
必须在与调用net.http_<method>
不同的事务中。
1select
2 net.http_post(
3 url:='https://httpbin.org/post',
4 body:='{"hello": "world"}'::jsonb
5 ) as request_id;
6request_id
7----------
8 1
9(1 row)
10
11select * from net.http_collect_response(1, async:=false);
12status | message | response
13--------+---------+----------
14SUCCESS ok (
15 status_code := 200,
16 headers := '{"date": ...}',
17 body := '{"args": ...}'
18 )::net.http_response_result
19
20
21select
22 (response).body::json
23from
24 net.http_collect_response(request_id:=1);
25 body
26-------------------------------------------------------------------
27 {
28 "args": {},
29 "data": "{\"hello\": \"world\"}",
30 "files": {},
31 "form": {},
32 "headers": {
33 "Accept": "*/*",
34 "Content-Length": "18",
35 "Content-Type": "application/json",
36 "Host": "httpbin.org",
37 "User-Agent": "pg_net/0.2",
38 "X-Amzn-Trace-Id": "Root=1-61031a5c-7e1afeae69bffa8614d8e48e"
39 },
40 "json": {
41 "hello": "world"
42 },
43 "origin": "135.63.38.488",
44 "url": "https://httpbin.org/post"
45 }
46(1 row)
其中,response
是一个组合:
1status_code integer 2headers jsonb 3body text
net.http_response_result.status的可能值是
('PENDING', 'SUCCESS', 'ERROR')'。