json-api-server/requests.html

47 lines
14 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Handling Requests | json-api-server</title>
<meta name="generator" content="VuePress 1.8.2">
<meta name="description" content="A fully automated JSON:API server implementation in PHP.">
<link rel="preload" href="/json-api-server/assets/css/0.styles.57b98ad2.css" as="style"><link rel="preload" href="/json-api-server/assets/js/app.67f738be.js" as="script"><link rel="preload" href="/json-api-server/assets/js/2.45932810.js" as="script"><link rel="preload" href="/json-api-server/assets/js/20.b9e8a752.js" as="script"><link rel="prefetch" href="/json-api-server/assets/js/10.f39ec3a0.js"><link rel="prefetch" href="/json-api-server/assets/js/11.724dd987.js"><link rel="prefetch" href="/json-api-server/assets/js/12.9934b242.js"><link rel="prefetch" href="/json-api-server/assets/js/13.01e72a34.js"><link rel="prefetch" href="/json-api-server/assets/js/14.0a2e817f.js"><link rel="prefetch" href="/json-api-server/assets/js/15.88e8e5d1.js"><link rel="prefetch" href="/json-api-server/assets/js/16.c308b4df.js"><link rel="prefetch" href="/json-api-server/assets/js/17.8ed4f1c9.js"><link rel="prefetch" href="/json-api-server/assets/js/18.3550a25e.js"><link rel="prefetch" href="/json-api-server/assets/js/19.65cfb425.js"><link rel="prefetch" href="/json-api-server/assets/js/21.80416eea.js"><link rel="prefetch" href="/json-api-server/assets/js/22.c8abdf2c.js"><link rel="prefetch" href="/json-api-server/assets/js/23.298bad12.js"><link rel="prefetch" href="/json-api-server/assets/js/24.f0bf2e90.js"><link rel="prefetch" href="/json-api-server/assets/js/25.5bf262d7.js"><link rel="prefetch" href="/json-api-server/assets/js/26.1472df94.js"><link rel="prefetch" href="/json-api-server/assets/js/3.54f7104d.js"><link rel="prefetch" href="/json-api-server/assets/js/4.a1fa2109.js"><link rel="prefetch" href="/json-api-server/assets/js/5.42433e02.js"><link rel="prefetch" href="/json-api-server/assets/js/6.60d915b0.js"><link rel="prefetch" href="/json-api-server/assets/js/7.62c9b4c8.js"><link rel="prefetch" href="/json-api-server/assets/js/8.2eaea85f.js"><link rel="prefetch" href="/json-api-server/assets/js/9.e517d767.js">
<link rel="stylesheet" href="/json-api-server/assets/css/0.styles.57b98ad2.css">
</head>
<body>
<div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/json-api-server/" class="home-link router-link-active"><!----> <span class="site-name">json-api-server</span></a> <div class="links"><!----> <nav class="nav-links can-hide"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/json-api-server/" class="nav-link">
Guide
</a></div> <a href="https://github.com/tobyz/json-api-server" target="_blank" rel="noopener noreferrer" class="repo-link">
GitHub
<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>Getting Started</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/" aria-current="page" class="sidebar-link">Introduction</a></li><li><a href="/json-api-server/install.html" class="sidebar-link">Installation</a></li><li><a href="/json-api-server/requests.html" aria-current="page" class="active sidebar-link">Handling Requests</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/json-api-server/requests.html#authentication" class="sidebar-link">Authentication</a></li></ul></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Defining Resources</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/adapters.html" class="sidebar-link">Adapters</a></li><li><a href="/json-api-server/scopes.html" class="sidebar-link">Scopes</a></li><li><a href="/json-api-server/attributes.html" class="sidebar-link">Attributes</a></li><li><a href="/json-api-server/relationships.html" class="sidebar-link">Relationships</a></li><li><a href="/json-api-server/visibility.html" class="sidebar-link">Field Visibility</a></li><li><a href="/json-api-server/writing.html" class="sidebar-link">Field Writability</a></li><li><a href="/json-api-server/filtering.html" class="sidebar-link">Filtering</a></li><li><a href="/json-api-server/sorting.html" class="sidebar-link">Sorting</a></li><li><a href="/json-api-server/pagination.html" class="sidebar-link">Pagination</a></li><li><a href="/json-api-server/meta.html" class="sidebar-link">Meta Information</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Endpoints</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/list.html" class="sidebar-link">Listing Resources</a></li><li><a href="/json-api-server/show.html" class="sidebar-link">Showing Resources</a></li><li><a href="/json-api-server/create.html" class="sidebar-link">Creating Resources</a></li><li><a href="/json-api-server/update.html" class="sidebar-link">Updating Resources</a></li><li><a href="/json-api-server/delete.html" class="sidebar-link">Deleting Resources</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Advanced</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/json-api-server/errors.html" class="sidebar-link">Error Handling</a></li><li><a href="/json-api-server/laravel.html" class="sidebar-link">Laravel Helpers</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h1 id="handling-requests"><a href="#handling-requests" class="header-anchor">#</a> Handling Requests</h1> <p>The <code>JsonApi</code> class is a <a href="https://www.php-fig.org/psr/psr-15/" target="_blank" rel="noopener noreferrer">PSR-15 request handler<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a>.</p> <p>Instantiate it with your <strong>API's base path</strong>, then pass in a PSR-7 request and you'll get back a PSR-7 response. You should catch any exceptions and pass them back into the <code>error</code> method to generate a JSON:API error document.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token keyword">use</span> <span class="token package">Tobyz<span class="token punctuation">\</span>JsonApiServer<span class="token punctuation">\</span>JsonApi</span><span class="token punctuation">;</span>
<span class="token variable">$api</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">JsonApi</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'/api'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/** @var Psr\Http\Message\ServerRequestInterface $request */</span>
<span class="token comment">/** @var Psr\Http\Message\ResponseInterface $response */</span>
<span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token variable">$response</span> <span class="token operator">=</span> <span class="token variable">$api</span><span class="token operator">-&gt;</span><span class="token function">handle</span><span class="token punctuation">(</span><span class="token variable">$request</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> <span class="token variable">$e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token variable">$response</span> <span class="token operator">=</span> <span class="token variable">$api</span><span class="token operator">-&gt;</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token variable">$e</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre></div><div class="custom-block tip"><p class="custom-block-title">TIP</p> <p>In Laravel, you'll need to <a href="https://laravel.com/docs/8.x/requests#psr7-requests" target="_blank" rel="noopener noreferrer">convert the Laravel request into a PSR-7 request<span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a> before you can pass it into <code>JsonApi</code>. You can then return the response directly from the route or controller the framework will automatically convert it back into a Laravel response and display it.</p></div> <h2 id="authentication"><a href="#authentication" class="header-anchor">#</a> Authentication</h2> <p>You (or your framework) are responsible for performing authentication.</p> <p>Often you will need to access information about the authenticated user inside of your schema for example, when <a href="scopes">scoping</a> which resources a visible within the API. An effective way to pass on this information is by setting an attribute on your Request object before passing it into the request handler.</p> <div class="language-php extra-class"><pre class="language-php"><code><span class="token variable">$request</span> <span class="token operator">=</span> <span class="token variable">$request</span><span class="token operator">-&gt;</span><span class="token function">withAttribute</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'user'</span><span class="token punctuation">,</span> <span class="token variable">$user</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
</code></pre></div></div> <footer class="page-edit"><div class="edit-link"><a href="https://github.com/tobyz/json-api-server/edit/master/docs/requests.md" target="_blank" rel="noopener noreferrer">Edit this page</a> <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></div> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev">
<a href="/json-api-server/install.html" class="prev">
Installation
</a></span> <span class="next"><a href="/json-api-server/adapters.html">
Adapters
</a>
</span></p></div> </main></div><div class="global-ui"></div></div>
<script src="/json-api-server/assets/js/app.67f738be.js" defer></script><script src="/json-api-server/assets/js/2.45932810.js" defer></script><script src="/json-api-server/assets/js/20.b9e8a752.js" defer></script>
</body>
</html>