mirror of
https://github.com/tuono-labs/tuono
synced 2026-07-25 12:52:47 -07:00
docs: add API routes page (#528)
Co-authored-by: Marco Pasqualetti <24919330+marcalexiei@users.noreply.github.com>
This commit is contained in:
@@ -121,6 +121,11 @@ export const sidebarElements: Array<SidebarElement> = [
|
||||
label: 'Link and navigation',
|
||||
href: '/documentation/routing/link-and-navigation',
|
||||
},
|
||||
{
|
||||
type: 'element',
|
||||
label: 'API routes',
|
||||
href: '/documentation/routing/api-routes',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
import MetaTags from '@/components/MetaTags'
|
||||
|
||||
<MetaTags
|
||||
title="Tuono - API routes"
|
||||
canonical="https://tuono.dev/documentation/routing/api-routes"
|
||||
/>
|
||||
|
||||
import Breadcrumbs from '@/components/Breadcrumbs'
|
||||
|
||||
<Breadcrumbs breadcrumbs={[{ label: 'API routes' }]} />
|
||||
|
||||
# API routes
|
||||
|
||||
## Overview
|
||||
|
||||
API routes offer a solution for building a public API using Tuono.
|
||||
|
||||
Any file inside the `src/routes/api` folder is mapped to the `/api/*` path
|
||||
and will be treated as an API endpoint, rather than a React route.
|
||||
|
||||
Tuono server is internally managed by [axum](https://docs.rs/axum/latest/axum/).
|
||||
The API system allows you to create APIs using most of the axum syntax.
|
||||
Tuono re-exports axum `tuono_lib::axum::*` to be seamlessly used within any Tuono app.
|
||||
|
||||
The major differences are:
|
||||
|
||||
- The function to be matched with Tuono's file system routing must have the
|
||||
`tuono_lib::api(method)` macro attribute on top of it.
|
||||
- The first argument of the function is always a `tuono_lib::Request`.
|
||||
|
||||
Tuono also supports [dynamic routes](/documentation/routing/dynamic-routes) for APIs.
|
||||
|
||||
## Example
|
||||
|
||||
If you create `src/routes/api/books.rs` with the following content,
|
||||
any HTTP GET request to `/api/books` will return a list of the queried books as JSON.
|
||||
|
||||
```rs
|
||||
use tuono_lib::Request;
|
||||
use tuono_lib::axum::response::IntoResponse;
|
||||
|
||||
use serde_json::{Value, json};
|
||||
|
||||
#[tuono_lib::api(GET)]
|
||||
async fn book_list(req: Request) -> Json<Value> {
|
||||
let books = get_books_from_db().await;
|
||||
|
||||
Json(json!(books))
|
||||
}
|
||||
```
|
||||
|
||||
> Unlike React routes, API must not return `tuono_lib::Response`
|
||||
|
||||
The same file can contain multiple HTTP methods.
|
||||
|
||||
```rs
|
||||
#[tuono_lib::api(GET)]
|
||||
async fn get_book_list(req: Request) -> Json<Value> {
|
||||
//...
|
||||
}
|
||||
|
||||
#[tuono_lib::api(POST)]
|
||||
async fn add_book_to_library(req: Request) -> impl IntoResponse {
|
||||
//...
|
||||
}
|
||||
```
|
||||
Reference in New Issue
Block a user