123 lines
116 KiB
HTML
123 lines
116 KiB
HTML
<!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://<meine.studip.installation.de>/<eventuell-mit-pfad>/jsonapi.php/v1/<routen></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><STUDIP-URI>/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->app->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->app->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->app->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->app->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->app->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->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->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 => \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"><?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->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' => (string) $semester->name,</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> 'description' => (string) $semester->description,</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> 'start' => date('c', $semester->beginn),</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> 'end' => date('c', $semester->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><irgendwas>_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"><?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 => true,</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> self::LINKS => [</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> Link::RELATED => new Link('/courses/'.$course->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 => $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 => 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"><?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->get('/whiteboards', WhiteboardsIndex::class);</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> $app->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->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 => WhiteboardSchema::class,</span><br></span><span class="token-line" style="color: rgb(248, 248, 242);"><span class="token plain"> WhiteboardColor::class => 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> |