d718c5a372
CI / compile_and_lint (push) Failing after 0s
CI / docker_build (linux/amd64, -linux-amd64-duckdb, duckdb) (push) Failing after 0s
CI / docker_build (linux/arm64, -linux-arm64, minimal) (push) Failing after 2s
CI / docker_build (linux/arm64, -linux-arm64-duckdb, duckdb) (push) Failing after 1s
CI / docker_build (linux/amd64, minimal) (push) Failing after 1s
CI / test (, sqlite, sqlite::memory:) (push) Has been skipped
CI / test (mssql, mssql, mssql://root:Password123!@127.0.0.1/sqlpage) (push) Has been skipped
CI / test (mysql, mysql, mysql://root:Password123!@127.0.0.1/sqlpage) (push) Has been skipped
CI / test (oracle, oracle, Driver=Oracle 21 ODBC driver;Dbq=//127.0.0.1:1521/FREEPDB1;Uid=root;Pwd=Password123!) (push) Has been skipped
CI / test (postgres, odbc, Driver=PostgreSQL Unicode;Server=127.0.0.1;Port=5432;Database=sqlpage;UID=root;PWD=Password123!, true) (push) Has been skipped
CI / test (postgres, postgres, postgres://root:Password123!@127.0.0.1/sqlpage) (push) Has been skipped
CI / playwright (push) Has been skipped
CI / docker_build (linux/arm/v7, -linux-arm-v7, minimal) (push) Failing after 0s
CI / hurl_examples (push) Failing after 8s
deploy website / deploy_official_site (push) Failing after 1s
CI / hurl (${{ matrix.example }}) (push) Has been skipped
CI / docker_push (duckdb) (push) Has been cancelled
CI / docker_push (minimal) (push) Has been cancelled
CI / windows_test (push) Has been cancelled
129 lines
4.8 KiB
SQL
129 lines
4.8 KiB
SQL
INSERT INTO sqlpage_functions (
|
|
"name",
|
|
"introduced_in_version",
|
|
"icon",
|
|
"description_md"
|
|
)
|
|
VALUES (
|
|
'fetch',
|
|
'0.20.3',
|
|
'transfer-vertical',
|
|
'Sends an HTTP request and returns the results as a string.
|
|
|
|
### Example
|
|
|
|
#### Simple GET query
|
|
|
|
In this example, we use an API call to find the latitude and longitude of a place
|
|
the user searched for, and we display it on a map.
|
|
|
|
We use the simplest form of the fetch function, that takes the URL to fetch as a string.
|
|
|
|
|
|
```sql
|
|
set url = ''https://nominatim.openstreetmap.org/search?format=json&q='' || sqlpage.url_encode($user_search)
|
|
set api_results = sqlpage.fetch($url);
|
|
|
|
select ''map'' as component;
|
|
select $user_search as title,
|
|
CAST($api_results->>0->>''lat'' AS FLOAT) as latitude,
|
|
CAST($api_results->>0->>''lon'' AS FLOAT) as longitude;
|
|
```
|
|
|
|
#### POST query with a body
|
|
|
|
In this example, we use the complex form of the function to make an
|
|
authenticated POST request, with custom request headers and a custom request body.
|
|
|
|
We use SQLite''s json functions to build the request body.
|
|
See [the list of SQL databases and their JSON functions](/blog.sql?post=JSON%20in%20SQL%3A%20A%20Comprehensive%20Guide) for
|
|
more information on how to build JSON objects in your database.
|
|
|
|
```sql
|
|
set request = json_object(
|
|
''method'', ''POST'',
|
|
''url'', ''https://postman-echo.com/post'',
|
|
''headers'', json_object(
|
|
''Content-Type'', ''application/json'',
|
|
''Authorization'', ''Bearer '' || sqlpage.environment_variable(''MY_API_TOKEN'')
|
|
),
|
|
''body'', json_object(
|
|
''Hello'', ''world''
|
|
)
|
|
);
|
|
set api_results = sqlpage.fetch($request);
|
|
|
|
select ''code'' as component;
|
|
select
|
|
''API call results'' as title,
|
|
''json'' as language,
|
|
$api_results as contents;
|
|
```
|
|
|
|
|
|
#### Authenticated request using Basic Auth
|
|
|
|
Here''s how to make a request to an API that requires [HTTP Basic Authentication](https://en.wikipedia.org/wiki/Basic_access_authentication):
|
|
|
|
```sql
|
|
set request = json_object(
|
|
''url'', ''https://api.example.com/data'',
|
|
''username'', ''my_username'',
|
|
''password'', ''my_password''
|
|
);
|
|
set api_results = sqlpage.fetch($request);
|
|
```
|
|
|
|
> This will add the `Authorization: Basic bXlfdXNlcm5hbWU6bXlfcGFzc3dvcmQK` header to the request,
|
|
> where `bXlfdXNlcm5hbWU6bXlfcGFzc3dvcmQK` is the base64 encoding of the string `my_username:my_password`.
|
|
|
|
# JSON parameter format
|
|
|
|
The fetch function accepts either a URL string, or a JSON object with the following parameters:
|
|
- `url`: The URL to fetch. Required.
|
|
- `method`: The HTTP method to use. Defaults to `GET`.
|
|
- `headers`: A JSON object with the headers to send. Defaults to sending a User-Agent header containing the SQLPage version.
|
|
- `body`: The body of the request. If it is a JSON object, it will be sent as JSON. If it is a string, it will be sent as is. When omitted, no request body is sent.
|
|
- `timeout_ms`: The maximum time to wait for the request, in milliseconds. Defaults to 5000.
|
|
- `username`: Optional username for HTTP Basic Authentication. Introduced in version 0.33.0.
|
|
- `password`: Optional password for HTTP Basic Authentication. Only used if username is provided. Introduced in version 0.33.0.
|
|
- `response_encoding`: Optional charset to use for decoding the response body. Defaults to `utf8`, or `base64` if the response contains binary data. All [standard web encodings](https://encoding.spec.whatwg.org/#concept-encoding-get) are supported, plus `hex`, `base64`, and `base64url`. Introduced in version 0.37.0.
|
|
|
|
# Error handling and reading response headers
|
|
|
|
If the request fails, this function throws an error, that will be displayed to the user.
|
|
The response headers are not available for inspection.
|
|
|
|
## Conditional data fetching
|
|
|
|
Since v0.40, `sqlpage.fetch(null)` returns null instead of throwing an error.
|
|
This makes it easier to conditionnally query an API:
|
|
|
|
```sql
|
|
set current_field_value = (select field from my_table where id = 1);
|
|
set target_url = nullif(''http://example.com/api/field/1'', null); -- null if the field is currently null in the db
|
|
set api_value = sqlpage.fetch($target_url); -- no http request made if the field is not null in the db
|
|
update my_table set field = $api_value where id = 1 and $api_value is not null; -- update the field only if it was not present before
|
|
```
|
|
|
|
## Advanced usage
|
|
|
|
If you need to handle errors or inspect the response headers or the status code,
|
|
use [`sqlpage.fetch_with_meta`](?function=fetch_with_meta).
|
|
'
|
|
);
|
|
INSERT INTO sqlpage_function_parameters (
|
|
"function",
|
|
"index",
|
|
"name",
|
|
"description_md",
|
|
"type"
|
|
)
|
|
VALUES (
|
|
'fetch',
|
|
1,
|
|
'url',
|
|
'Either a string containing an URL to request, or a json object in the standard format of the request interface of the web fetch API.',
|
|
'TEXT'
|
|
);
|