Files
studipsync/docs/studip/jsonapi/Routen _ Stud.IP Entwicklung.html

123 lines
116 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="de" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-jsonapi/routen TridactylThemeDefault" data-has-hydrated="true" data-theme="dark" data-theme-choice="system" data-rh="lang,dir,class,data-has-hydrated"><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v3.9.2">
<title>Routen | Stud.IP Entwicklung</title><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://docs.gitlab.studip.de/entwicklung/img/docusaurus-social-card.jpg"><meta data-rh="true" name="twitter:image" content="https://docs.gitlab.studip.de/entwicklung/img/docusaurus-social-card.jpg"><meta data-rh="true" property="og:locale" content="de"><meta data-rh="true" name="docusaurus_locale" content="de"><meta data-rh="true" name="docsearch:language" content="de"><link data-rh="true" rel="icon" href="https://www.studip.de/favicon.ico"><link rel="stylesheet" href="Routen%20_%20Stud.IP%20Entwicklung_files/styles.b7b49933.css">
<script src="Routen%20_%20Stud.IP%20Entwicklung_files/runtime~main.a9a7ee27.js" defer="defer"></script>
<script src="Routen%20_%20Stud.IP%20Entwicklung_files/main.e2e1aaf7.js" defer="defer"></script>
<style type="text/css">@media print {
.TridactylStatusIndicator {
display: none !important;
}
}</style><style>:is([id*='google_ads_iframe'],[id*='taboola-'],.taboolaHeight,.taboola-placeholder,#top-ad,#credential_picker_container,#credentials-picker-container,#credential_picker_iframe,[id*='google-one-tap-iframe'],#google-one-tap-popup-container,.google-one-tap__module,.google-one-tap-modal-div,#amp_floatingAdDiv,#ez-content-blocker-container) {display:none!important;min-height:0!important;height:0!important;}</style><meta name="viewport" content="width=device-width, initial-scale=1.0" data-rh="true"><meta name="docusaurus_version" content="current" data-rh="true"><meta name="docusaurus_tag" content="docs-default-current" data-rh="true"><meta name="docsearch:version" content="current" data-rh="true"><meta name="docsearch:docusaurus_tag" content="docs-default-current" data-rh="true"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/c4f5d8e4.6aab1160.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7456010.bfbe5a55.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a3c3149e.31200326.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/98ce8162.2561e535.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/e218b6c2.ef43a0c3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/85b8aab7.83ab4b0a.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/fe9dbfb4.03460074.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5ffc0618.1b1ba0ed.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/52d937e2.df5bec27.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/92d34d3b.77217d07.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/b11b84c9.64b74380.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/bdfbcf04.344a348d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/d3a3b7c2.19d5a8a8.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/3d7fd858.9933ca6c.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/3a96e12d.5f8d4e67.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/277d502f.e9784259.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/dc503fcf.a20dd635.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/15299744.1626b379.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/d499939c.d8d6ac7c.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2187e72e.5b4f5c0c.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/eb4ba05a.5b147d3e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/4082fca7.d673256b.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/7473e9d6.89d03d86.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/8617fbda.f908222d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/715e9115.1c464b67.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/edebfda0.ce7d2979.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/f0bb6daf.dba78f0c.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/ee50ba83.2337e10b.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/7bfada87.eda62efc.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/fd8c3471.f46b5145.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/5e95c892.3cfc45d3.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/aba21aa0.29a02732.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a7bd4aaa.1a4cdcca.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/2ede7082.39a7981d.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/a94703ab.1041176e.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/17896441.e9a40bc0.js"><link rel="prefetch" href="https://docs.gitlab.studip.de/entwicklung/assets/js/eddb30be.e1a816d5.js"><link rel="canonical" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/routen" data-rh="true"><link rel="alternate" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/routen" hreflang="de" data-rh="true"><link rel="alternate" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/routen" hreflang="x-default" data-rh="true"><meta property="og:url" content="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/routen" data-rh="true"><meta property="og:title" content="Routen | Stud.IP Entwicklung" data-rh="true"><meta name="description" content="Diese Dokumentation befasst sich mit der Entwicklung von JSON:API-Routen." data-rh="true"><meta property="og:description" content="Diese Dokumentation befasst sich mit der Entwicklung von JSON:API-Routen." data-rh="true"><script type="application/ld+json" data-rh="true">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Routen","item":"https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/routen"}]}</script></head>
<body class="" data-rh="class" data-theme="dark" style="overflow: visible;">
<svg style="display: none;"><defs>
<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></symbol>
</defs></svg>
<script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||(window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light")),document.documentElement.setAttribute("data-theme-choice",t||"system")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><span class="cleanslate TridactylStatusIndicator TridactylModenormal ">normal</span><div id="__docusaurus"><link rel="preload" as="image" href="Routen%20_%20Stud.IP%20Entwicklung_files/studip-hilfe.png"><div role="region" aria-label="Zum Hauptinhalt springen"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Zum Hauptinhalt springen</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="https://docs.gitlab.studip.de/entwicklung/"><div class="navbar__logo"><img src="Routen%20_%20Stud.IP%20Entwicklung_files/studip-hilfe.png" alt="Stud.IP Entwicklung" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div></a><a class="navbar__item navbar__link" href="https://docs.gitlab.studip.de/entwicklung/docs/quickstart/">Schnelleinstieg</a><a class="navbar__item navbar__link" href="https://docs.gitlab.studip.de/entwicklung/docs/start">Dokumentation</a><a class="navbar__item navbar__link" href="https://docs.gitlab.studip.de/entwicklung/docs/rules/introduction">Organisation</a></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://docs.gitlab.studip.de/api" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">API<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><a href="https://gitlab.studip.de/" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">Stud.IP GitLab<svg width="13.5" height="13.5" aria-label="(opens in new tab)" class="iconExternalLink_nPIU"><use href="#theme-svg-external-link"></use></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP" type="button" title="system mode" aria-label="Umschalten zwischen dunkler und heller Ansicht (momentan system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" class="toggleIcon_g3eP systemToggleIcon_QzmC"><path fill="currentColor" d="m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><div class="dsla-search-wrapper"><div class="dsla-search-field" data-tags="default,docs-default-current"><div class="aa-Autocomplete" role="combobox" aria-expanded="false" aria-haspopup="listbox" aria-labelledby="autocomplete-0-label"><button type="button" class="aa-DetachedSearchButton" title="Search" id="autocomplete-0-label"><div class="aa-DetachedSearchButtonIcon" aria-label="Search"><svg class="aa-SubmitIcon" viewBox="0 0 24 24" width="20" height="20" fill="currentColor"><path d="M16.041 15.856c-0.034 0.026-0.067 0.055-0.099 0.087s-0.060 0.064-0.087 0.099c-1.258 1.213-2.969 1.958-4.855 1.958-1.933 0-3.682-0.782-4.95-2.050s-2.050-3.017-2.050-4.95 0.782-3.682 2.050-4.95 3.017-2.050 4.95-2.050 3.682 0.782 4.95 2.050 2.050 3.017 2.050 4.95c0 1.886-0.745 3.597-1.959 4.856zM21.707 20.293l-3.675-3.675c1.231-1.54 1.968-3.493 1.968-5.618 0-2.485-1.008-4.736-2.636-6.364s-3.879-2.636-6.364-2.636-4.736 1.008-6.364 2.636-2.636 3.879-2.636 6.364 1.008 4.736 2.636 6.364 3.879 2.636 6.364 2.636c2.125 0 4.078-0.737 5.618-1.968l3.675 3.675c0.391 0.391 1.024 0.391 1.414 0s0.391-1.024 0-1.414z"></path></svg></div><div class="aa-DetachedSearchButtonPlaceholder">Suchen...</div><div class="aa-DetachedSearchButtonQuery"></div></button></div></div></div></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Zurück nach oben scrollen" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="https://docs.gitlab.studip.de/entwicklung/docs/start"><span title="Übersicht" class="linkLabel_WmDU">Übersicht</span></a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false"><span title="Plugins" class="categoryLinkLabel_W154">Plugins</span></a></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="https://docs.gitlab.studip.de/entwicklung/docs/coding-style"><span title="Coding Style" class="linkLabel_WmDU">Coding Style</span></a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false"><span title="Visual Style Guide" class="categoryLinkLabel_W154">Visual Style Guide</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a href="#" class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" role="button" aria-expanded="true"><span title="JSON:API" class="categoryLinkLabel_W154">JSON:API</span></a></div><ul class="menu__list" style="display: block; overflow: visible; height: auto; will-change: height; transition: height 390ms ease-in-out;"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/start"><span title="Einführung" class="linkLabel_WmDU">Einführung</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" tabindex="0" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/routen" aria-current="page"><span title="Routen" class="linkLabel_WmDU">Routen</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/errors"><span title="Fehler" class="linkLabel_WmDU">Fehler</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/users"><span title="Nutzer*innen" class="linkLabel_WmDU">Nutzer*innen</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/activitystreams"><span title="Activity Streams" class="linkLabel_WmDU">Activity Streams</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/news"><span title="Ankündigungen (News)" class="linkLabel_WmDU">Ankündigungen (News)</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/blubber"><span title="Blubber" class="linkLabel_WmDU">Blubber</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/files"><span title="Dateibereich" class="linkLabel_WmDU">Dateibereich</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/forum"><span title="Forum" class="linkLabel_WmDU">Forum</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/institutes"><span title="Einrichtungen" class="linkLabel_WmDU">Einrichtungen</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/contacts"><span title="Kontakte" class="linkLabel_WmDU">Kontakte</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/messages"><span title="Nachrichten" class="linkLabel_WmDU">Nachrichten</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/planer"><span title="Planer" class="linkLabel_WmDU">Planer</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/semesters"><span title="Semester" class="linkLabel_WmDU">Semester</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/courses"><span title="Veranstaltungen" class="linkLabel_WmDU">Veranstaltungen</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/wiki"><span title="Wiki" class="linkLabel_WmDU">Wiki</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/discovery"><span title="Discovery" class="linkLabel_WmDU">Discovery</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/studip"><span title="Stud.IP-System" class="linkLabel_WmDU">Stud.IP-System</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/resources"><span title="Räume/Gebäude" class="linkLabel_WmDU">Räume/Gebäude</span></a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false"><span title="REST-API" class="categoryLinkLabel_W154">REST-API</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false"><span title="Barrierefreiheit" class="categoryLinkLabel_W154">Barrierefreiheit</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false"><span title="Testing" class="categoryLinkLabel_W154">Testing</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false"><span title="Vue.js" class="categoryLinkLabel_W154">Vue.js</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false"><span title="Funktionen" class="categoryLinkLabel_W154">Funktionen</span></a></div></li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="https://docs.gitlab.studip.de/entwicklung/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><span class="breadcrumbs__link">JSON:API</span></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Routen</span></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">Auf dieser Seite</button></div><div class="theme-doc-markdown markdown"><header><h1>Routen</h1></header><p>Diese Dokumentation befasst sich mit der Entwicklung von JSON:API-Routen.</p>
<p>Die Stud.IP JSON:API ist zu erreichen unter der URI:</p>
<p><code>https://&lt;meine.studip.installation.de&gt;/&lt;eventuell-mit-pfad&gt;/jsonapi.php/v1/&lt;routen&gt;</code></p>
<p>Für den Developer-Server also zum Beispiel unter:</p>
<p><code>https://develop.studip.de/studip/jsonapi.php/v1/semesters</code></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="was-ist-die-studip-json">Was ist die Stud.IP JSON:API?<a href="#was-ist-die-studip-json" class="hash-link" aria-label="Direkter Link zur was-ist-die-studip-json" title="Direkter Link zur was-ist-die-studip-json" translate="no"></a></h3>
<p>Die Stud.IP JSON:API implementiert eine externe Schnittstelle zum Zugriff auf Stud.IP-Datenstrukturen und entspricht der JSON:API-Spezifikation (<a href="https://jsonapi.org/" target="_blank" rel="noopener noreferrer" class="">https://jsonapi.org/</a>). Zur Verständnis empfiehlt es sich, diese Spezifikation zu lesen.</p>
<p>Geht ein JSON:API-Request ein, werden nacheinander die folgenden Schritte durchlaufen:</p>
<ul>
<li class="">Routen-Zuordnung: Welcher Code wird für welche URI und welches HTTP-Verb ausgeführt?</li>
<li class="">Routen-Handler: Liefert eine JSON:API-konforme Antwort. Oft werden ein oder mehrere Stud.IP-Objekte zurückgegeben.</li>
<li class="">Schema-Zuordnung: Welche Schemaklasse kann Objekte einer bestimmten Stud.IP-Klasse in JSON umwandeln?</li>
<li class="">Schemas: Definiert die Abbildung eines Stud.IP-Objekts in JSON.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="image" width="1240" height="126" class="img_ev3q" src="Routen%20_%20Stud.IP%20Entwicklung_files/image-93593b846b6c8c6065de6f38a8cf09af.png">
JSON:API-Ablauf</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="routen-zuordnung">Routen-Zuordnung<a href="#routen-zuordnung" class="hash-link" aria-label="Direkter Link zur Routen-Zuordnung" title="Direkter Link zur Routen-Zuordnung" translate="no"></a></h3>
<p>In der Datei <code>/lib/classes/JsonApi/RouteMap.php</code> werden URIs auf zuständigen Code abgebildet. Dabei beginnen alle URIs immer mit <code>&lt;STUDIP-URI&gt;/jsonapi.php/v1/</code>. Sobald ein Request an solche URIs geht, wird mithilfe der <code>RouteMap</code> der entsprechende Code, der Routen-Handler, herausgesucht und aufgerufen.</p>
<p>Routen können erfordern, dass Nutzer angemeldet sind: In diesem Fall werden die Routen in der Methode <code>RouteMap#authenticatedRoutes</code> definiert. Ist keine Nutzeranmeldung erforderlich, werden die Routen in <code>RouteMap#unauthenticatedRoutes</code> definiert.</p>
<p>Da <code>Slim</code> für das Routing verwendet wird, lohnt sich ein Blick in die entsprechende <a href="https://www.slimframework.com/docs/v3/objects/router.html" target="_blank" rel="noopener noreferrer" class="">Doku.</a></p>
<p>Ausschnitt aus der der Datei <code>RouteMap.php</code>:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #F8F8F2; --prism-background-color: #282A36;"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color: rgb(248, 248, 242); background-color: rgb(40, 42, 54);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">namespace JsonApi;</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">class RouteMap</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">{</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> public function authenticatedRoutes()</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> {</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> //</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> $this-&gt;app-&gt;get('/blubber-comments', Routes\Blubber\CommentsIndex::class);</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> $this-&gt;app-&gt;get('/blubber-comments/{id}', Routes\Blubber\CommentsShow::class);</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> $this-&gt;app-&gt;patch('/blubber-comments/{id}', Routes\Blubber\CommentsUpdate::class);</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> $this-&gt;app-&gt;delete('/blubber-comments/{id}', Routes\Blubber\CommentsDelete::class);</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> //</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> }</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> //</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup_M5ko"><button type="button" aria-label="In die Zwischenablage kopieren" title="Kopieren" class="clean-btn"><span class="copyButtonIcons_IEyt" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_TrPX"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_cVMy"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="routen-handler">Routen-Handler<a href="#routen-handler" class="hash-link" aria-label="Direkter Link zur Routen-Handler" title="Direkter Link zur Routen-Handler" translate="no"></a></h3>
<p>Routen-Handler sind Unterklassen von <code>JsonApi\JsonApiController</code> und implementieren die magische Methode <code>__invoke</code>. Routen-Handler verhalten sich JSON:API-konform und bedienen sich dabei insbesondere der geerbeten Methoden:</p>
<ul>
<li class=""><code>getContentResponse</code></li>
<li class=""><code>getPaginatedContentResponse</code></li>
<li class=""><code>getCreatedResponse</code></li>
<li class=""><code>getCodeResponse</code></li>
</ul>
<p>Die wichtigsten Methoden sind dabei <code>getContentResponse</code> und <code>getPaginatedContentResponse</code>,
da sie verwendet werden, um Stud.IP-Objekte zurückzugeben. Der
Unterschiede wird schon im Namen deutlich. Die paginierte Variante
funktioniert nur mit Listen von Stud.IP-Objekten.</p>
<p>Beide Methoden werden verwendet, wenn in der JSON:API Stud.IP-Datenstrukturen ausgelesen werden sollen, wenn also ein <code>GET</code>-Request an die Stud.IP JSON:API gerichtet wurde.</p>
<p>Dazu übergibt man lediglich das Stud.IP-Objekt an diese Methode und ist fertig:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #F8F8F2; --prism-background-color: #282A36;"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color: rgb(248, 248, 242); background-color: rgb(40, 42, 54);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> // in der RouteMap</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> $this-&gt;app-&gt;get('/blubber-threads/{id}', Routes\Blubber\ThreadsShow::class);</span><br></span></code></pre><div class="buttonGroup_M5ko"><button type="button" aria-label="In die Zwischenablage kopieren" title="Kopieren" class="clean-btn"><span class="copyButtonIcons_IEyt" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_TrPX"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_cVMy"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #F8F8F2; --prism-background-color: #282A36;"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color: rgb(248, 248, 242); background-color: rgb(40, 42, 54);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">class ThreadsShow extends JsonApiController</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">{</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> public function __invoke(Request $request, Response $response, $args)</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> {</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> if (!$resource = \BlubberThread::find($args['id'])) {</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> throw new RecordNotFoundException();</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> }</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> if (!Authority::canShowBlubberThread($this-&gt;getUser($request), $resource)) {</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> throw new AuthorizationFailedException();</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> }</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> return $this-&gt;getContentResponse($resource);</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> }</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup_M5ko"><button type="button" aria-label="In die Zwischenablage kopieren" title="Kopieren" class="clean-btn"><span class="copyButtonIcons_IEyt" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_TrPX"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_cVMy"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Hier sieht man den generellen Aufruf der Methode <code>getContentResponse</code>.</p>
<ul>
<li class="">Der Routen-Handler <code>ThreadsShow</code> ist eine Unterklasse von <code>JsonApi\JsonApiController</code>.</li>
<li class="">Der Routen-Handler implementiert die magische Methode <code>__invoke</code>.</li>
<li class="">Hier kommt der typische Dreisatz: Auslesen, Authorisieren, Zurückgeben.</li>
<li class="">Um den <code>BlubberThread</code> auslesen zu können, entnehmen wir der URI den Parameter <code>id</code>. Dieser war in der RouteMap definiert worden.</li>
<li class="">Nun überprüfen wir, ob der eingeloggte Nutzer diese Daten lesen darf. Dafür verwenden wir die Methode <code>JsonApiController#getUser</code>.</li>
<li class="">Zum Schluß übergeben wir den ausgelesenen <code>BlubberThread</code> an <code>getContentResponse</code> und das Ergebnis ist dann auch das Ergebnis des Requests.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="schema-zuordnung">Schema-Zuordnung<a href="#schema-zuordnung" class="hash-link" aria-label="Direkter Link zur Schema-Zuordnung" title="Direkter Link zur Schema-Zuordnung" translate="no"></a></h3>
<p>Wie kann die Stud.IP-JSON:API wissen, wie aus einem Stud.IP-<code>BlubberThread</code>-Objekt spezifikationskonformes JSON wird?</p>
<p>Dafür ist zunächst die Schema-Zuordnung wichtig. Diese befindet sich in der Datei <code>/lib/classes/JsonApi/SchemaMap.php</code>. Und darin werden Stud.IP-Klassen auf Schema-Klassen abgebildet:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #F8F8F2; --prism-background-color: #282A36;"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color: rgb(248, 248, 242); background-color: rgb(40, 42, 54);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">\BlubberThread::class =&gt; \JsonApi\Schemas\BlubberThread::class,</span><br></span></code></pre><div class="buttonGroup_M5ko"><button type="button" aria-label="In die Zwischenablage kopieren" title="Kopieren" class="clean-btn"><span class="copyButtonIcons_IEyt" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_TrPX"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_cVMy"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Wird also mithilfe von beispielsweise <code>getContentResponse</code> ein <code>BlubberThread</code>-Objekt geliefert, wird die Schema-Klasse <code>JsonApi\Schemas\BlubberThread</code> für die Umwandlung verwendet.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="schemaklassen">Schemaklassen<a href="#schemaklassen" class="hash-link" aria-label="Direkter Link zur Schemaklassen" title="Direkter Link zur Schemaklassen" translate="no"></a></h3>
<p>Schemaklassen machen aus einem Stud.IP-Objekt eine JSON:API-konforme Repräsentation. Die <code>User</code>-Schemaklasse macht zum Beispiel aus diesem Objekt:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #F8F8F2; --prism-background-color: #282A36;"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color: rgb(248, 248, 242); background-color: rgb(40, 42, 54);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">$me = \User::findCurrent();</span><br></span></code></pre><div class="buttonGroup_M5ko"><button type="button" aria-label="In die Zwischenablage kopieren" title="Kopieren" class="clean-btn"><span class="copyButtonIcons_IEyt" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_TrPX"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_cVMy"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>diese Darstellung, die JSON:API-konforme ist:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #F8F8F2; --prism-background-color: #282A36;"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color: rgb(248, 248, 242); background-color: rgb(40, 42, 54);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token punctuation" style="color: rgb(248, 248, 242);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token string-property property">"data"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(248, 248, 242);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token string-property property">"type"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(255, 121, 198);">"users"</span><span class="token punctuation" style="color: rgb(248, 248, 242);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token string-property property">"id"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(255, 121, 198);">"205f3efb7997a0fc9755da2b535038da"</span><span class="token punctuation" style="color: rgb(248, 248, 242);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token string-property property">"attributes"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(248, 248, 242);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token string-property property">"username"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(255, 121, 198);">"test_dozent"</span><span class="token punctuation" style="color: rgb(248, 248, 242);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token string-property property">"formatted-name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(255, 121, 198);">"Testaccount Dozent"</span><span class="token punctuation" style="color: rgb(248, 248, 242);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token string-property property">"family-name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(255, 121, 198);">"Dozent"</span><span class="token punctuation" style="color: rgb(248, 248, 242);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token string-property property">"given-name"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(255, 121, 198);">"Testaccount"</span><span class="token punctuation" style="color: rgb(248, 248, 242);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token string-property property">"name-prefix"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(255, 121, 198);">""</span><span class="token punctuation" style="color: rgb(248, 248, 242);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token string-property property">"name-suffix"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(255, 121, 198);">""</span><span class="token punctuation" style="color: rgb(248, 248, 242);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token string-property property">"permission"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(255, 121, 198);">"dozent"</span><span class="token punctuation" style="color: rgb(248, 248, 242);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token string-property property">"email"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(255, 121, 198);">"dozent@studip.de"</span><span class="token punctuation" style="color: rgb(248, 248, 242);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token string-property property">"phone"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token keyword null nil" style="color: rgb(189, 147, 249); font-style: italic;">null</span><span class="token punctuation" style="color: rgb(248, 248, 242);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token string-property property">"homepage"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token keyword null nil" style="color: rgb(189, 147, 249); font-style: italic;">null</span><span class="token punctuation" style="color: rgb(248, 248, 242);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token string-property property">"address"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token keyword null nil" style="color: rgb(189, 147, 249); font-style: italic;">null</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(248, 248, 242);">}</span><span class="token punctuation" style="color: rgb(248, 248, 242);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token string-property property">"relationships"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(248, 248, 242);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token string-property property">"activitystream"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(248, 248, 242);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token string-property property">"links"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(248, 248, 242);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token string-property property">"related"</span><span class="token operator">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(255, 121, 198);">"jsonapi.php/v1/users/205f3efb7997a0fc9755da2b535038da/activitystream"</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(248, 248, 242);">}</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(248, 248, 242);">}</span><span class="token punctuation" style="color: rgb(248, 248, 242);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(248, 248, 242);">}</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"></span><span class="token punctuation" style="color: rgb(248, 248, 242);">}</span><br></span></code></pre><div class="buttonGroup_M5ko"><button type="button" aria-label="In die Zwischenablage kopieren" title="Kopieren" class="clean-btn"><span class="copyButtonIcons_IEyt" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_TrPX"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_cVMy"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Wenn man die Schemaklassen in aller Ausführlichkeit verstehen möchte, sollte man zuvor den entsprechenden Teil der JSON:API-Spezifikation gelesen haben: <a href="https://jsonapi.org/format/#document-structure" target="_blank" rel="noopener noreferrer" class="">https://jsonapi.org/format/#document-structure</a></p>
<p>Die Schemaklassen bieten alle Möglichkeiten, die in der Spezifikation
vorgestellt werden. Am wichtigsten sind sicherlich aber die ID, der
Type, die Attribute und Relationships eines <code>Resource Object</code>s.</p>
<p>Zunächst ein Beispiel: Diese Schemaklasse beschreibt die Umwandlung von Stud.IPs <code>Semester</code>-Objekten in eine spezifikationskonforme JSON-Form.</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #F8F8F2; --prism-background-color: #282A36;"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color: rgb(248, 248, 242); background-color: rgb(40, 42, 54);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">&lt;?php</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">namespace JsonApi\Schemas;</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">class Semester extends SchemaProvider</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">{</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> const TYPE = 'semesters';</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> // [A]: Type</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> protected $resourceType = self::TYPE;</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> // [B]: ID</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> public function getId($semester)</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> {</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> return $semester-&gt;id;</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> }</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> // [C]: Attributes</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> public function getAttributes($semester)</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> {</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> return [</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> 'title' =&gt; (string) $semester-&gt;name,</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> 'description' =&gt; (string) $semester-&gt;description,</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> 'start' =&gt; date('c', $semester-&gt;beginn),</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> 'end' =&gt; date('c', $semester-&gt;ende),</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> ];</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> }</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup_M5ko"><button type="button" aria-label="In die Zwischenablage kopieren" title="Kopieren" class="clean-btn"><span class="copyButtonIcons_IEyt" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_TrPX"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_cVMy"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="id-und-type">ID und Type<a href="#id-und-type" class="hash-link" aria-label="Direkter Link zur ID und Type" title="Direkter Link zur ID und Type" translate="no"></a></h4>
<p>Laut <a href="https://jsonapi.org/format/#document-resource-object-identification" target="_blank" rel="noopener noreferrer" class="">Spezifikation</a> benötigt jedes <code>Resource Object</code> eine ID und einen Type. Im Beispiel oben werden an Stelle A der Type und an Stelle B die ID definiert. Für alle Stud.IP-JSON:API-Types gilt:</p>
<ul>
<li class="">Der Type steht immer im Plural.</li>
<li class="">Der Type muss in <code>kebap-case</code> geschrieben sein.</li>
</ul>
<p>Die ID wird über die überschriebene Methode <code>getId</code> festgelegt und muss einen String zurückliefern.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="attribute">Attribute<a href="#attribute" class="hash-link" aria-label="Direkter Link zur Attribute" title="Direkter Link zur Attribute" translate="no"></a></h4>
<p>Die <a href="https://jsonapi.org/format/#document-resource-object-attributes" target="_blank" rel="noopener noreferrer" class="">Spezifikation</a> ist bezüglich der Attribute von <code>Resource Objects</code> sehr klar. In der Stud.IP JSON:API werden sie definiert, indem man die Methode <code>getAttributes</code> überschreibt.</p>
<ul>
<li class="">Rückgabewert muss ein PHP-Array sein.</li>
<li class="">Schlüssel und Werte müssen UTF-8 kodiert sind.</li>
<li class="">Erlaubte Zeichen für Schlüssel werden in der <a href="https://jsonapi.org/format/#document-member-names" target="_blank" rel="noopener noreferrer" class="">Spezifikation</a> definiert.</li>
<li class="">Folgende Schlüssel können nicht gewählt werden: <code>type</code>, <code>id</code>, <code>data</code>.</li>
<li class="">Die in Stud.IP-SORM häufig direkt verwendeten Fremdschlüssel <code>&lt;irgendwas&gt;_id</code> sollten in aller Regel keine Attribute sondern Relationen sein.</li>
<li class="">Etwaige menschenlesbare Versionen von Attributen müssen den Zusatz <code>-readable</code> am Attributnamen erhalten.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="relationships">Relationships<a href="#relationships" class="hash-link" aria-label="Direkter Link zur Relationships" title="Direkter Link zur Relationships" translate="no"></a></h4>
<p>Die <a href="https://jsonapi.org/format/#document-resource-object-relationships" target="_blank" rel="noopener noreferrer" class="">Relationships</a> sind ein sehr mächtiges Merkmal der JSON:API-Spezifikation. Es empfiehlt sich sehr, die entsprechenden Kapitel zu lesen, um die verschiedene Termini zu kennen.</p>
<p>Letztendlich muss auch hier wieder die Methode <code>getRelationships</code> überschrieben werden, die ein Array von Relationships liefert. Wesentlich für eine Relation sind sicherlich:</p>
<ul>
<li class="">Die Relationship möchte Daten liefern: <code>data</code></li>
<li class="">Die Relationship möchte einen Link zur Relation selbst liefern: <code>links[self]</code></li>
<li class="">Die Relationship möchte einen Link auf das verknüpfte Objekt liefern: <code>links[related]</code></li>
</ul>
<p>Eine Relationship mit diesen drei Merkmalen gleichzeitig, sieht im Beispiel so aus:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #F8F8F2; --prism-background-color: #282A36;"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color: rgb(248, 248, 242); background-color: rgb(40, 42, 54);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">&lt;?php</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">namespace JsonApi\Schemas;</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">class BlubberThread extends SchemaProvider</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">{</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> //</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> public function getRelationships($resource, $isPrimary, array $includeList)</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> {</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> $relationships = [];</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> //</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> $course = \Course::find($resource['context_id']);</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> $relationships[self::REL_CONTEXT] = [</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> self::SHOW_SELF =&gt; true,</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> self::LINKS =&gt; [</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> Link::RELATED =&gt; new Link('/courses/'.$course-&gt;id)</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> ], </span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> self::DATA =&gt; $course</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> ];</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> </span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> //</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> return $relationships;</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> }</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup_M5ko"><button type="button" aria-label="In die Zwischenablage kopieren" title="Kopieren" class="clean-btn"><span class="copyButtonIcons_IEyt" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_TrPX"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_cVMy"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Die <code>context</code>-Relationship eines BlubberThreads möchte:</p>
<ul>
<li class="">Daten liefern und legt diese unter dem Schlüssel <code>self::DATA</code> in der Relationship ab.</li>
<li class="">einen Link zur Relationship selbst liefern und ergänzt daher: <code>self::SHOW_SELF =&gt; true</code></li>
<li class="">einen Link auf das verknüpfte Objekt liefern und setzt daher einen entsprechenden Eintrag im <code>self::LINKS</code>-Array.</li>
</ul>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="was-ist-mit-plugins">Was ist mit Plugins?<a href="#was-ist-mit-plugins" class="hash-link" aria-label="Direkter Link zur Was ist mit Plugins?" title="Direkter Link zur Was ist mit Plugins?" translate="no"></a></h4>
<p>Plugins dürfen ebenfalls Routen und Schemata registrieren. Dazu muss
ein Plugin lediglich das Plugin-Interface <code>JsonApi\Contracts\JsonApiPlugin</code> implementieren.</p>
<p>Ein Beispiel:</p>
<div class="language-php codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #F8F8F2; --prism-background-color: #282A36;"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-php codeBlock_bY9V thin-scrollbar" style="color: rgb(248, 248, 242); background-color: rgb(40, 42, 54);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">&lt;?php</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">use JsonApi\Contracts\JsonApiPlugin;</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">class MyPlugin extends StudIPPlugin implements StandardPlugin, JsonApiPlugin</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">{</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> //</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> public function registerAuthenticatedRoutes(\Slim\App $app)</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> {</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> $app-&gt;get('/whiteboards', WhiteboardsIndex::class);</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> $app-&gt;get('/whiteboards/{id}', WhiteboardsShow::class);</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> }</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> public function registerUnauthenticatedRoutes(\Slim\App $app)</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> {</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> $app-&gt;get('/whiteboard-colors', WhiteboardColorsIndex::class);</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> }</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> public function registerSchema()</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> {</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> return [</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> Whiteboard::class =&gt; WhiteboardSchema::class,</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> WhiteboardColor::class =&gt; WhiteboardColorSchema::class</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> ];</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> }</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain">}</span><br></span></code></pre><div class="buttonGroup_M5ko"><button type="button" aria-label="In die Zwischenablage kopieren" title="Kopieren" class="clean-btn"><span class="copyButtonIcons_IEyt" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_TrPX"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_cVMy"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Die darin angegebenen Routen und Schemata werden dann wie oben beschrieben implementiert.</p>
<p>Ein Beispiel zur Einbindung findet sich hier:</p>
<p><a href="https://gitlab.studip.de/marcus/studip-plugin-jsonapi-example" target="_blank" rel="noopener noreferrer" class="">https://gitlab.studip.de/marcus/studip-plugin-jsonapi-example</a></p></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col noPrint_WFHX"><a href="https://gitlab.studip.de/docs/entwicklung/-/tree/main/website/docs/jsonapi/02-routen.md" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Diese Seite bearbeiten</a></div><div class="col lastUpdated_JAkA"><span class="theme-last-updated">Letztes Update am <b><time datetime="2025-11-04T08:47:39.000Z" itemprop="dateModified">4. Nov. 2025</time></b> von <b>marcus</b></span></div></div></footer></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Dokumentation Seiten"><a class="pagination-nav__link pagination-nav__link--prev" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/start"><div class="pagination-nav__sublabel">Zurück</div><div class="pagination-nav__label">Einführung</div></a><a class="pagination-nav__link pagination-nav__link--next" href="https://docs.gitlab.studip.de/entwicklung/docs/jsonapi/errors"><div class="pagination-nav__sublabel">Weiter</div><div class="pagination-nav__label">Fehler</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#was-ist-die-studip-json" class="table-of-contents__link toc-highlight table-of-contents__link--active">Was ist die Stud.IP JSON?</a></li><li><a href="#routen-zuordnung" class="table-of-contents__link toc-highlight">Routen-Zuordnung</a></li><li><a href="#routen-handler" class="table-of-contents__link toc-highlight">Routen-Handler</a></li><li><a href="#schema-zuordnung" class="table-of-contents__link toc-highlight">Schema-Zuordnung</a></li><li><a href="#schemaklassen" class="table-of-contents__link toc-highlight">Schemaklassen</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer footer--dark"><div class="container container-fluid"><div class="footer__bottom text--center"><div class="footer__copyright">Copyright © 2025 Stud.IP. Built with Docusaurus.</div></div></div></footer></div>
</body><iframe class="cleanslate hidden" src="Routen%20_%20Stud.IP%20Entwicklung_files/commandline.html" id="cmdline_iframe" loading="lazy" inert="" style="height: 0px !important;"></iframe></html>