pg_net: Async Networking
caution
The pg_net API is in alpha. Functions signatures may change.
pg_net is a PostgreSQL extension exposing a SQL interface for async networking with a focus on scalability and UX.
It differs from the http
extension in that it is asynchronous by default. This makes it useful in blocking functions (like triggers).
Enable the extension#
- Go to the Database page in the Dashboard.
- Click on Extensions in the sidebar.
- Search for "pg_net" and enable the extension.
http_get
#
Creates an HTTP GET request returning the request's ID. HTTP requests are not started until the transaction is committed.
Signature #
caution
This is a Postgres SECURITY DEFINER function.
_18net.http_get(_18 -- url for the request_18 url text,_18 -- key/value pairs to be url encoded and appended to the `url`_18 params jsonb default '{}'::jsonb,_18 -- key/values to be included in request headers_18 headers jsonb default '{}'::jsonb,_18 -- WARNING: this is currently ignored, so there is no timeout_18 -- the maximum number of milliseconds the request may take before being cancelled_18 timeout_milliseconds int default 1000_18)_18 -- request_id reference_18 returns bigint_18_18 strict_18 volatile_18 parallel safe_18 language plpgsql
Usage #
_10select net.http_get('https://news.ycombinator.com') as request_id;_10request_id_10----------_10 1_10(1 row)
http_post
#
Creates an HTTP POST request with a JSON body, returning the request's ID. HTTP requests are not started until the transaction is committed.
The body's character set encoding matches the database's server_encoding
setting.
Signature #
caution
This is a Postgres SECURITY DEFINER function
_19net.http_post(_19 -- url for the request_19 url text,_19 -- body of the POST request_19 body jsonb default '{}'::jsonb,_19 -- key/value pairs to be url encoded and appended to the `url`_19 params jsonb default '{}'::jsonb,_19 -- key/values to be included in request headers_19 headers jsonb default '{"Content-Type": "application/json"}'::jsonb,_19 -- WARNING: this is currently ignored, so there is no timeout_19 -- the maximum number of milliseconds the request may take before being cancelled_19 timeout_milliseconds int default 1000_19)_19 -- request_id reference_19 returns bigint_19_19 volatile_19 parallel safe_19 language plpgsql
Usage #
_10select_10 net.http_post(_10 url:='https://httpbin.org/post',_10 body:='{"hello": "world"}'::jsonb_10 ) as request_id;_10request_id_10----------_10 1_10(1 row)
After triggering http_post
, use http_get_result
to get the result of the request.
Examples#
Invoke a Supabase Edge Function#
Make a POST request to a Supabase Edge Function with auth header and JSON body payload:
_10select_10 net.http_post(_10 url:='https://project-ref.supabase.co/functions/v1/function-name',_10 headers:='{"Content-Type": "application/json", "Authorization": "Bearer YOUR_ANON_KEY"}'::jsonb,_10 body:='{"name": "pg_net"}'::jsonb_10 ) as request_id;
Resources#
- Source code: github.com/supabase/pg_net
- Official Docs: supabase.github.io/pg_net