Back to Supabase

http: RESTful Client

apps/docs/content/guides/database/extensions/http.mdx

1.26.042.7 KB
Original Source

The http extension allows you to call RESTful endpoints within Postgres.

Quick demo

<div className="video-container"> <iframe src="https://www.youtube-nocookie.com/embed/rARgrELRCwY" frameBorder="1" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowFullScreen ></iframe> </div>

Overview

Let's cover some basic concepts:

  • REST: stands for REpresentational State Transfer. It's a way to request data from external services.
  • RESTful APIs are servers which accept HTTP "calls". The calls are typically:
    • GET − Read only access to a resource.
    • POST − Creates a new resource.
    • DELETE − Removes a resource.
    • PUT − Updates an existing resource or creates a new resource.

You can use the http extension to make these network requests from Postgres.

Usage

Enable the extension

<Tabs scrollable size="small" type="underlined" defaultActiveId="dashboard" queryGroup="database-method"

<TabPanel id="dashboard" label="Dashboard">
  1. Go to the Database page in the Dashboard.
  2. Click on Extensions in the sidebar.
  3. Search for http and enable the extension.
</TabPanel> <TabPanel id="sql" label="SQL">
sql
-- Example: enable the "http" extension
create extension http with schema extensions;

-- Example: disable the "http" extension
drop extension if exists http;

Even though the SQL code is create extension, this is the equivalent of "enabling the extension". To disable an extension, call drop extension.

It's good practice to create the extension within a separate schema (like extensions) to keep the public schema clean.

</TabPanel> </Tabs>

Available functions

While the main usage is http('http_request'), there are 5 wrapper functions for specific functionality:

  • http_get()
  • http_post()
  • http_put()
  • http_delete()
  • http_head()

Returned values

A successful call to a web URL from the http extension returns a record with the following fields:

  • status: integer
  • content_type: character varying
  • headers: http_header[]
  • content: character varying. Typically you would want to cast this to jsonb using the format content::jsonb

Examples

Simple GET example

sql
select
  "status", "content"::jsonb
from
  extensions.http_get('https://jsonplaceholder.typicode.com/todos/1');

Simple POST example

sql
select
  "status", "content"::jsonb
from
  extensions.http_post(
    'https://jsonplaceholder.typicode.com/posts',
    '{ "title": "foo", "body": "bar", "userId": 1 }',
    'application/json'
  );

Resources