{{ message }}
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathannotations_http.md.BDBFWX1o.js
More file actions
65 lines (65 loc) · 33.9 KB
/
Copy pathannotations_http.md.BDBFWX1o.js
File metadata and controls
65 lines (65 loc) · 33.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import{_ as a,c as i,o as n,a5 as e}from"./chunks/framework.CgT1UzWm.js";const k=JSON.parse('{"title":"HTTP Annotation","titleTemplate":"NpgsqlRest","description":"Expose PostgreSQL functions, procedures, and SQL files as HTTP endpoints. Configure HTTP methods (GET, POST, PUT, DELETE, QUERY) and custom URL paths.","frontmatter":{"outline":[2,3],"title":"HTTP Annotation","titleTemplate":"NpgsqlRest","description":"Expose PostgreSQL functions, procedures, and SQL files as HTTP endpoints. Configure HTTP methods (GET, POST, PUT, DELETE, QUERY) and custom URL paths.","head":[["meta",{"name":"keywords","content":"npgsqlrest http annotation, postgresql http endpoint, rest api function, http method postgresql"}],["meta",{"property":"og:title","content":"NpgsqlRest HTTP Annotation"}],["meta",{"property":"og:description","content":"Expose PostgreSQL functions, procedures, and SQL files as HTTP endpoints with configurable methods and paths."}],["meta",{"property":"og:type","content":"article"}],["link",{"rel":"canonical","href":"https://npgsqlrest.github.io/annotations/http.html"}],["meta",{"property":"og:url","content":"https://npgsqlrest.github.io/annotations/http.html"}],["meta",{"property":"og:image","content":"https://npgsqlrest.github.io/og-image.png"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:title","content":"NpgsqlRest HTTP Annotation"}],["meta",{"name":"twitter:description","content":"Expose PostgreSQL functions, procedures, and SQL files as HTTP endpoints with configurable methods and paths."}],["meta",{"name":"twitter:image","content":"https://npgsqlrest.github.io/og-image.png"}]]},"headers":[],"relativePath":"annotations/http.md","filePath":"annotations/http.md","lastUpdated":1782480183000}'),t={name:"annotations/http.md"};function l(p,s,h,r,d,o){return n(),i("div",null,s[0]||(s[0]=[e(`<h1 id="http" tabindex="-1">HTTP <a class="header-anchor" href="#http" aria-label="Permalink to "HTTP""></a></h1><p>Expose a PostgreSQL function, procedure, or SQL file as an HTTP endpoint.</p><h2 id="keywords" tabindex="-1">Keywords <a class="header-anchor" href="#keywords" aria-label="Permalink to "Keywords""></a></h2><p><code>http</code></p><h2 id="syntax" tabindex="-1">Syntax <a class="header-anchor" href="#syntax" aria-label="Permalink to "Syntax""></a></h2><details class="code-collapsible" open><summary>code</summary><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes catppuccin-latte catppuccin-mocha vp-code" tabindex="0"><code><span class="line"><span>HTTP</span></span>
<span class="line"><span>HTTP <method></span></span>
<span class="line"><span>HTTP <path></span></span>
<span class="line"><span>HTTP <method> <path></span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div></details><p><strong>method</strong>: <code>GET</code>, <code>POST</code>, <code>PUT</code>, <code>DELETE</code>, <code>QUERY</code></p><p><code>QUERY</code> is the recently standardized safe, idempotent HTTP method that carries the query in the request body: parameters default to the JSON body (like POST), while clients treat it as a cacheable read (the TypeScript client's React Query hooks map it to <code>useQuery</code>, MCP tools get <code>readOnlyHint: true</code>). Available since version 3.20.0. Note: QUERY endpoints are not representable in OpenAPI 3.0/3.1 documents and are skipped there with a logged warning.</p><p><strong>path</strong>: Custom URL path (must start with <code>/</code> or be a relative path)</p><h2 id="commentsmode-requirement" tabindex="-1">CommentsMode Requirement <a class="header-anchor" href="#commentsmode-requirement" aria-label="Permalink to "CommentsMode Requirement""></a></h2><p>The <code>HTTP</code> annotation behavior depends on the <a href="./../config/npgsqlrest.html#comments-mode">CommentsMode</a> configuration setting:</p><div class="table-container"><div class="table-wrapper"><table tabindex="0"><thead><tr><th>Mode</th><th>HTTP Annotation Behavior</th></tr></thead><tbody><tr><td><code>OnlyAnnotated</code></td><td><strong>Required</strong> - Endpoints are only created for routines with <code>HTTP</code> in their comment (or a plugin annotation that requests an endpoint, such as <code>@mcp</code>). Default. <code>OnlyWithHttpTag</code> is a backward-compatible alias.</td></tr><tr><td><code>ParseAll</code></td><td>Optional - All routines become endpoints; <code>HTTP</code> can customize method/path.</td></tr><tr><td><code>Ignore</code></td><td>Ignored - All routines become endpoints; comments are not parsed.</td></tr></tbody></table></div></div><p>With the default <code>OnlyAnnotated</code> mode, a function without the <code>HTTP</code> annotation will not be exposed as an endpoint.</p><h2 id="default-behavior" tabindex="-1">Default Behavior <a class="header-anchor" href="#default-behavior" aria-label="Permalink to "Default Behavior""></a></h2><p>When method is not specified:</p><ul><li><code>GET</code> for non-volatile functions, or names starting with <code>get_</code>, containing <code>_get_</code>, or ending with <code>_get</code></li><li><code>POST</code> for all other functions</li></ul><p>When path is not specified, it's generated from the function name using the configured URL prefix and naming conventions.</p><h2 id="examples" tabindex="-1">Examples <a class="header-anchor" href="#examples" aria-label="Permalink to "Examples""></a></h2><h3 id="basic-endpoint" tabindex="-1">Basic Endpoint <a class="header-anchor" href="#basic-endpoint" aria-label="Permalink to "Basic Endpoint""></a></h3><details class="code-collapsible" open><summary>sql</summary><div class="language-sql vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes catppuccin-latte catppuccin-mocha vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">create</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> function</span><span style="--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic;"> get_status</span><span style="--shiki-light:#7C7F93;--shiki-dark:#9399B2;">()</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">returns</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> text</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">language</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> sql</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">begin</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> atomic</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">select</span><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1;"> 'OK'</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">end</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">comment on function get_status() is </span><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1;">'HTTP'</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div></details><p><strong>Equivalent as a SQL file endpoint</strong> (<code>sql/get-status.sql</code>):</p><details class="code-collapsible" open><summary>sql</summary><div class="language-sql vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes catppuccin-latte catppuccin-mocha vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#9CA0B0;--shiki-light-font-style:italic;--shiki-dark:#6C7086;--shiki-dark-font-style:italic;">-- HTTP</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">select</span><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1;"> 'OK'</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div></details><p>Creates: <code>GET /api/get-status</code></p><h3 id="explicit-http-method" tabindex="-1">Explicit HTTP Method <a class="header-anchor" href="#explicit-http-method" aria-label="Permalink to "Explicit HTTP Method""></a></h3><details class="code-collapsible" open><summary>sql</summary><div class="language-sql vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes catppuccin-latte catppuccin-mocha vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">create</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> function</span><span style="--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic;"> create_user</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">(_name </span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">text</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">)</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">returns</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> int</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">language</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> sql</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">begin</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> atomic</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">insert into</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;"> users(</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">name</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">) </span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">values</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">(_name) returning id;</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">end</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">comment on function create_user(text) is </span><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1;">'HTTP POST'</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div></details><p>Creates: <code>POST /api/create-user</code></p><h3 id="custom-path" tabindex="-1">Custom Path <a class="header-anchor" href="#custom-path" aria-label="Permalink to "Custom Path""></a></h3><details class="code-collapsible" open><summary>sql</summary><div class="language-sql vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes catppuccin-latte catppuccin-mocha vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">create</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> function</span><span style="--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic;"> get_all_users</span><span style="--shiki-light:#7C7F93;--shiki-dark:#9399B2;">()</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">returns</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;"> setof users</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">language</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> sql</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">begin</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> atomic</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">select</span><span style="--shiki-light:#179299;--shiki-dark:#94E2D5;"> *</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> from</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;"> users;</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">end</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">comment on function get_all_users() is </span><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1;">'HTTP GET /users'</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div></details><p>Creates: <code>GET /users</code></p><h3 id="method-and-custom-path" tabindex="-1">Method and Custom Path <a class="header-anchor" href="#method-and-custom-path" aria-label="Permalink to "Method and Custom Path""></a></h3><details class="code-collapsible" open><summary>sql</summary><div class="language-sql vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes catppuccin-latte catppuccin-mocha vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">create</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> function</span><span style="--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic;"> search_products</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">(_query </span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">text</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">)</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">returns</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;"> setof products</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">language</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> sql</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">begin</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> atomic</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">select</span><span style="--shiki-light:#179299;--shiki-dark:#94E2D5;"> *</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> from</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;"> products </span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">where</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> name</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;"> ilike </span><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1;">'%'</span><span style="--shiki-light:#179299;--shiki-dark:#94E2D5;"> ||</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;"> _query </span><span style="--shiki-light:#179299;--shiki-dark:#94E2D5;">||</span><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1;"> '%'</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">end</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">comment on function search_products(text) is </span><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1;">'HTTP GET /products/search'</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div></details><p>Creates: <code>GET /products/search</code></p><h3 id="multi-line-with-documentation" tabindex="-1">Multi-line with Documentation <a class="header-anchor" href="#multi-line-with-documentation" aria-label="Permalink to "Multi-line with Documentation""></a></h3><details class="code-collapsible" open><summary>sql</summary><div class="language-sql vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes catppuccin-latte catppuccin-mocha vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">comment on function get_user_profile(int) is</span></span>
<span class="line"><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1;">'Returns the complete user profile including preferences.</span></span>
<span class="line"><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1;">Used by the frontend dashboard.</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1;">HTTP GET /users/profile'</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div></details><p>The documentation text is ignored; only the <code>HTTP</code> line is parsed.</p><h3 id="unrecognized-method-becomes-path" tabindex="-1">Unrecognized Method Becomes Path <a class="header-anchor" href="#unrecognized-method-becomes-path" aria-label="Permalink to "Unrecognized Method Becomes Path""></a></h3><details class="code-collapsible" open><summary>sql</summary><div class="language-sql vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes catppuccin-latte catppuccin-mocha vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">comment on function my_endpoint() is </span><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1;">'HTTP custom-endpoint'</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div></details><p>Since <code>custom-endpoint</code> is not a valid HTTP method, it's treated as a path:</p><p>Creates: <code>POST /custom-endpoint</code></p><h2 id="path-parameters" tabindex="-1">Path Parameters <a class="header-anchor" href="#path-parameters" aria-label="Permalink to "Path Parameters""></a></h2><p>You can define RESTful path parameters using the <code>{param}</code> syntax in URL paths. Parameter values are extracted directly from the URL path instead of query strings or request body.</p><h3 id="single-path-parameter" tabindex="-1">Single Path Parameter <a class="header-anchor" href="#single-path-parameter" aria-label="Permalink to "Single Path Parameter""></a></h3><details class="code-collapsible" open><summary>sql</summary><div class="language-sql vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes catppuccin-latte catppuccin-mocha vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">create</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> function</span><span style="--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic;"> get_product</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">(p_id </span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">int</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">)</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">returns</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> text</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">language</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> sql</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">begin</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> atomic</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">select</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;"> ...;</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">end</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">comment on function get_product(int) is </span><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1;">'HTTP GET /products/{p_id}'</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div></details><p>Call: <code>GET /products/123</code> → <code>p_id = 123</code></p><h3 id="multiple-path-parameters" tabindex="-1">Multiple Path Parameters <a class="header-anchor" href="#multiple-path-parameters" aria-label="Permalink to "Multiple Path Parameters""></a></h3><details class="code-collapsible" open><summary>sql</summary><div class="language-sql vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes catppuccin-latte catppuccin-mocha vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">create</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> function</span><span style="--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic;"> get_review</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">(p_id </span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">int</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">, review_id </span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">int</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">)</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">returns</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> text</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">language</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> sql</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">begin</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> atomic</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">select</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;"> ...;</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">end</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">comment on function get_review(int, int) is </span><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1;">'HTTP GET /products/{p_id}/reviews/{review_id}'</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div></details><p>Call: <code>GET /products/5/reviews/10</code> → <code>p_id = 5</code>, <code>review_id = 10</code></p><h3 id="path-parameters-with-query-string" tabindex="-1">Path Parameters with Query String <a class="header-anchor" href="#path-parameters-with-query-string" aria-label="Permalink to "Path Parameters with Query String""></a></h3><details class="code-collapsible" open><summary>sql</summary><div class="language-sql vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes catppuccin-latte catppuccin-mocha vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">create</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> function</span><span style="--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic;"> get_product_details</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">(p_id </span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">int</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">, include_reviews </span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">boolean</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> default</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;"> false)</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">returns</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> text</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">language</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> sql</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">begin</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> atomic</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">select</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;"> ...;</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">end</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">comment on function get_product_details(int, boolean) is </span><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1;">'HTTP GET /products/{p_id}/details'</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div></details><p>Call: <code>GET /products/42/details?includeReviews=true</code> → <code>p_id = 42</code>, <code>include_reviews = true</code></p><h3 id="path-parameters-with-json-body" tabindex="-1">Path Parameters with JSON Body <a class="header-anchor" href="#path-parameters-with-json-body" aria-label="Permalink to "Path Parameters with JSON Body""></a></h3><details class="code-collapsible" open><summary>sql</summary><div class="language-sql vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">sql</span><pre class="shiki shiki-themes catppuccin-latte catppuccin-mocha vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">create</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> function</span><span style="--shiki-light:#1E66F5;--shiki-light-font-style:italic;--shiki-dark:#89B4FA;--shiki-dark-font-style:italic;"> update_product</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">(p_id </span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">int</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">, new_name </span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">text</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">)</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">returns</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> text</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">language</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> sql</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">begin</span><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;"> atomic</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">select</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;"> ...;</span></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">end</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#8839EF;--shiki-dark:#CBA6F7;">comment on function update_product(int, text) is </span><span style="--shiki-light:#40A02B;--shiki-dark:#A6E3A1;">'HTTP POST /products/{p_id}'</span><span style="--shiki-light:#4C4F69;--shiki-dark:#CDD6F4;">;</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div></details><p>Call: <code>POST /products/7</code> with body <code>{"newName": "New Name"}</code> → <code>p_id = 7</code>, <code>new_name = "New Name"</code></p><h3 id="path-parameter-key-features" tabindex="-1">Path Parameter Key Features <a class="header-anchor" href="#path-parameter-key-features" aria-label="Permalink to "Path Parameter Key Features""></a></h3><ul><li>Parameter names in <code>{param}</code> can use either the PostgreSQL name (<code>{p_id}</code>) or the converted camelCase name (<code>{pId}</code>), matching is case-insensitive</li><li>Works with all HTTP methods (GET, POST, PUT, DELETE, QUERY)</li><li>Can be combined with query string parameters (GET/DELETE) or JSON body parameters (POST/PUT/QUERY)</li><li>Supports all parameter types (int, text, uuid, bigint, etc.)</li><li>Zero performance impact on endpoints without path parameters</li></ul><h2 id="related" tabindex="-1">Related <a class="header-anchor" href="#related" aria-label="Permalink to "Related""></a></h2><ul><li><a href="./../config/npgsqlrest.html">NpgsqlRest Options configuration</a> - Configure URL prefixes, naming conventions</li><li><a href="./../guide/annotations.html">Comment Annotations Guide</a> - How annotations work</li><li><a href="./../guide/configuration.html">Configuration Guide</a> - How configuration works</li></ul><h2 id="related-annotations" tabindex="-1">Related Annotations <a class="header-anchor" href="#related-annotations" aria-label="Permalink to "Related Annotations""></a></h2><ul><li><a href="./path.html">PATH</a> - Alternative way to set custom path</li><li><a href="./authorize.html">AUTHORIZE</a> - Require authentication</li><li><a href="./request-param-type.html">REQUEST_PARAM_TYPE</a> - Control parameter source</li></ul>`,59)]))}const u=a(t,[["render",l]]);export{k as __pageData,u as default};
You can’t perform that action at this time.
