{"id":778,"date":"2013-11-06T16:49:06","date_gmt":"2013-11-06T15:49:06","guid":{"rendered":"http:\/\/blog.visisoft.de\/yalst\/?p=778"},"modified":"2015-05-28T23:46:44","modified_gmt":"2015-05-28T21:46:44","slug":"requirejs-and-yalst-live-chat-javascript-api","status":"publish","type":"post","link":"https:\/\/www.yalst.de\/en\/requirejs-and-yalst-live-chat-javascript-api\/","title":{"rendered":"Configure RequireJS to load the yalst live chat JavaScript Api"},"content":{"rendered":"<h4>TL;DR<\/h4>\n<p>For loading outdated versions of the <a title=\"Visitor Api Docu\" href=\"http:\/\/docs.yalst.de\/visitor_api\/index.html\" target=\"_blank\">Visitor Chat JavaScript Api<\/a>\u00a0ensure the release version of <a title=\"RequireJS\" href=\"http:\/\/requirejs.org\" target=\"_blank\">RequireJS<\/a> does finish loading it&#8217;s <code>data-main<\/code> script before fetching the <a title=\"Visitor Api Docu\" href=\"http:\/\/docs.yalst.de\/visitor_api\/index.html\" target=\"_blank\">Visitor Api<\/a>.<\/p>\n<h4>Update &#8211; this post&#8217;s solution\u00a0is now obsolete (1. Aug. 2014)<\/h4>\n<p>The co-existence problems of the two RequireJS libraries have been resolved with the <a title=\"V. 2.1 Documentation\" href=\"http:\/\/docs.yalst.de\/visitor_api\/index.html\" target=\"_blank\">version 2.1 of the VisitorAPI<\/a>. The VisitorAPI library is distributed from now on as a single JavaScript file too. That source file is AMD loader compatible. Thus the VisitorAPI v. 2.1 no longer introduces global variables in the JavaScript context.<\/p>\n<p>The whole loading code condenses down to:<\/p>\n<pre class=\"prettyprint\"><code>requirejs.config({\r\n    paths: {\r\n            \/\/\/ load the Visitor API from the module named \"LiveSupport\"\r\n            LiveSupport: '\/\/YALST_PRODUCT_SERVER\/YALST_DIR\/visitor_api\/v2.1\/LiveSupport.min',\r\n\r\n            \/\/\/ or alternatively load the anonymous module\r\n            yalstAPI: '\/\/YALST_PRODUCT_SERVER\/YALST_DIR\/visitor_api\/v2.1\/LiveSupportAnonymous.min'\r\n        }\r\n    }\r\n);\r\n\r\nrequire([\"LiveSupport\"], function(LiveSupportLibrary)\r\n\u00a0 \u00a0 {\r\n\u00a0 \u00a0 \u00a0 \u00a0 LiveSupportLibrary.require([\"api\/VisitorAPI\"], function(api)\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \/\/ use the VisitorAPI provided in the api argument\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 \u00a0 \u00a0 );\r\n\u00a0 \u00a0 }\r\n);\r\n<\/code><\/pre>\n<p>The details are discussed in <a href=\"http:\/\/docs.yalst.de\/visitor_api\/tutorial-requireJSLoading.html\" target=\"_blank\">this tutorial<\/a>.<\/p>\n<h4>The Original Problem<\/h4>\n<p>The <a title=\"RequireJS\" href=\"http:\/\/requirejs.org\" target=\"_blank\">RequireJS<\/a> library adds support for Javascript modules which is missing in the current webbrowser implementations.<br \/>\nThe <a title=\"Visitor Api Docu\" href=\"http:\/\/docs.yalst.de\/visitor_api\/index.html\" target=\"_blank\">yalst Visitor Api<\/a> uses a <a title=\"HOW CAN I RENAME REQUIRE\/DEFINE\/REQUIREJS?\" href=\"http:\/\/requirejs.org\/docs\/faq-advanced.html#rename\" target=\"_blank\">renamed RequireJS<\/a> (version 2.1.9 at the time of writing) for code organisation and loading, and so may the client pages themselves.<br \/>\nHowever since RequireJS does not provide a <code>noConflict()<\/code> method both versions can interfere on the page resulting in Javascript errors.<\/p>\n<h4>RequireJS in the Visitor Api<\/h4>\n<p>The Visitor Chat JavaScript Api provides the namespace <code>LiveSupport<\/code> which<\/p>\n<ul>\n<li>under the namespace <code>LiveSupport.VisitorAPI<\/code> contains the <a title=\"Api Documentation\" href=\"http:\/\/visisoft.de\/visitor_api\" target=\"_blank\">documented public methods<\/a> and<\/li>\n<li>under the root contains it&#8217;s own version of RequireJS.<\/li>\n<\/ul>\n<p>Thus in addition to the <a title=\"Visitor Api Docu\" href=\"http:\/\/docs.yalst.de\/visitor_api\/index.html\" target=\"_blank\">documented use<\/a> these methods are available in the Api too:<\/p>\n<pre class=\"prettyprint\"><code>LiveSupport.define()\r\nLiveSupport.require()\r\nLiveSupport.requirejs()\r\n<\/code><\/pre>\n<p>The api is put in this namespace by the <a title=\"r.js' documentation\" href=\"http:\/\/requirejs.org\/docs\/optimization.html\" target=\"_blank\">RequireJS optimiser r.js<\/a> using a <em>build.js<\/em> file like this:<\/p>\n<pre class=\"prettyprint\"><code>({\r\n\tappDir: \".\",\r\n\tbaseUrl: \".\",\r\n\tpaths: {\r\n\t\trequireLib: \"vendor\/require\"  \/\/ path to vanilla RequireJS 2.1.9\r\n\t},\r\n\tnamespace: \"LiveSupport\",\r\n\tmodules: [\r\n\t\t{\r\n\t\t\tname: \"LiveSupport\",\r\n\t\t\tinclude: ['requireLib'],\r\n\t\t\tcreate: true\r\n\t\t}\r\n\t]\r\n})\r\n<\/code><\/pre>\n<h4>The Solution<\/h4>\n<p><em>The client page can use it&#8217;s own (non-namespaced) version of RequireJS, given it completes loading the <code>data-main<\/code> script before the Visitor Api&#8217;s namespaced version.<\/em><\/p>\n<h4>An Example<\/h4>\n<p>The example page <em>index-sync.html<\/em> uses RequireJS in <em>require.min.js<\/em> with the <code>data-main<\/code> script <em>main.js<\/em> to load <em>jQuery<\/em>, <em>underscore<\/em> and <em>Lo-Dash<\/em>.<br \/>\nIn this example the <code>&lt;script&gt;<\/code> tag for the Visitor Api is created &#8220;by hand&#8221; [<a href=\"#requirejs_ref1\">1<\/a>] in a function called from the <code>data-main<\/code> script <em>main.js<\/em>. This tag loads the Visitor Api&#8217;s own namespaced RequireJS in <em>LiveSupport.js<\/em> with the <code>data-main<\/code> script <em>LiveSupportMain.js<\/em> which in turn loads the actual api source files.<br \/>\nAmong the api files is yet an own version of <em>underscore<\/em> which by using <code>_.noConflict()<\/code> is guaranteed to be free of side effects for the client page.<\/p>\n<p>The directory structure and the <a title=\"Fiddler2\" href=\"http:\/\/fiddler2.com\" target=\"_blank\">network activity log<\/a> of a web page containing both the vanilla version of RequireJS and the namespaced version of the Visitor Api is shown here:<br \/>\n<img decoding=\"async\" loading=\"lazy\" class=\"alignleft size-full wp-image-804\" style=\"padding-top: 10px;\" src=\"https:\/\/www.yalst.de\/wp-content\/uploads\/2015\/04\/NoConflictLoadingNetworkLog.png\" alt=\"RequireJS NoConflict Loading NetworkLog\" width=\"636\" height=\"412\" \/><br \/>\nHere is the code to accomplish sequential loading of the libraries:<\/p>\n<pre class=\"prettyprint\" style=\"font-size: 10pt;\"><code>\/\/index-sync.html\r\n<script src=\"\/\/cdnjs.cloudflare.com\/ajax\/libs\/require.js\/2.1.9\/require.min.js\" data-main=\"main.js\"><\/script>\r\n<script>\/\/ <![CDATA[\r\nfunction onDataMainScriptLoaded()\r\n{\r\n\t\/\/\/ the page's own RequireJS library is now loaded\r\n\tif (typeof LiveSupport == \"undefined\"){\r\n\t\tLiveSupport = {};\r\n\t}\r\n\tif (typeof LiveSupport.VisitorAPI == \"undefined\"){\r\n\t\tLiveSupport.VisitorAPI = {};\r\n\t}\r\n\tif (typeof LiveSupport.VisitorAPI._methodQueue == \"undefined\"){\r\n\t\tLiveSupport.VisitorAPI._methodQueue = [];\r\n\t}\r\n\tLiveSupport.VisitorAPI.invoke = function(method, parameterArray, callback){\r\n\t\tif (typeof method != \"string\"){\r\n\t\t\tif (typeof callback == \"function\"){\r\n\t\t\t\tcallback(new Error(\"invalid argument: 1 must be string\"));\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tLiveSupport.VisitorAPI._methodQueue.push({\r\n\t\t\tmethod: method\r\n\t\t\t, parameters: parameterArray\r\n\t\t\t, callback: callback\r\n\t\t});\r\n\t};\r\n\tvar YALST_INSTALLATION_URL = \"\/\/YourYalstDomain\/YourYalstDirectory\/\";\r\n\t\/\/\/ if using loadScript.js\r\n\t\/\/loadScript(YALST_INSTALLATION_URL + \"visitor_api\/v2\/built\/LiveSupport.js\"\r\n\t\/\/\t, {\"data-main\" : YALST_INSTALLATION_URL + \"visitor_api\/v2\/built\/LiveSupportMain\"}\r\n\t\/\/);\r\n\t\/\/\/ \"by hand\" otherwise\r\n\tvar scripts = document.getElementsByTagName('script');\r\n\tvar anchorElement = scripts[scripts.length - 1];\r\n\tvar script = document.createElement(\"script\");\r\n\tscript.src = YALST_INSTALLATION_URL + \"visitor_api\/v2\/built\/LiveSupport.js\";\r\n\tscript.setAttribute(\"data-main\"\r\n\t\t, YALST_INSTALLATION_URL + \"visitor_api\/v2\/built\/LiveSupportMain\");\r\n\tanchorElement.parentNode.insertBefore(script, anchorElement);\r\n}\r\n\/\/ ]]><\/script><\/code><\/pre>\n<pre class=\"prettyprint\" style=\"font-size: 10pt;\"><code>\/\/main.js\r\nrequirejs.config({\r\n\tbaseUrl: 'lib',\r\n\tpaths: {\r\n\t\tapp: '..\/app',\r\n\t\tjquery: 'http:\/\/code.jquery.com\/jquery-1.10.2',\r\n\t\tunderscore: 'underscore'\r\n\t},\r\n\tshim: {\r\n\t\tunderscore: {\r\n\t\t\texports: '_'\r\n\t\t}\r\n\t}\r\n});\r\n\/\/ Start the main app logic.\r\nrequirejs(['jquery', 'underscore'],\r\n\tfunction($, _)\r\n\t{\r\n\t\t$.noConflict();\r\n\t\t_.noConflict();\r\n\t\t\/\/ see to load the Visitor Api\r\n\t\twindow.onDataMainScriptLoaded();\r\n\r\n\t\tjQuery(window.onReady);\r\n\t}\r\n);\r\n<\/code><\/pre>\n<pre class=\"prettyprint\" style=\"font-size: 10pt;\"><code>\/\/LiveSupportMain.js\r\nLiveSupport.requirejs.config({\r\n\t\/\/skipDataMain: true,\r\n\twaitSeconds: 15,\r\n\tpaths: {\r\n\t\tunderscore: 'vendor\/underscore'\r\n\t},\r\n\tshim: {\r\n\t\tunderscore: {\r\n\t\t\texports: '_'\r\n\t\t}\r\n\t}\r\n});\r\nLiveSupport.require(['underscore'], function(_)\r\n\t{\r\n\t\t_.noConflict();\r\n\t}\r\n);\r\n\r\n\/\/\/ Load the Api into the root object LiveSupport \/\/\/\r\nLiveSupport.define(['api\/VisitorAPI'], function(VisitorApi)\r\n\t{\r\n\t\t\/\/\/ initialize the API\r\n\u2026\r\n<\/code><\/pre>\n<div><span id=\"requirejs_ref1\">[1]<\/span> To define the order in which the libraries are fetched by the browser <a title=\"loadScript.js on GitHub\" href=\"https:\/\/github.com\/semmel\/loadScript\" target=\"_blank\">loadScript.js<\/a> could be used for dynamic injection of <code>&lt;script&gt;<\/code> tags into the DOM and handling of the <code>load<\/code> and <code>readystatechange<\/code> events.<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Loading the multi-file JavaScript Visitor Api 2.0 with a non-namespaced version of RequireJS co-existing with the web page&#8217;s own RequireJS version. <\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[46],"tags":[63,68,88],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.12 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Configure RequireJS to load the yalst live chat JavaScript Api<\/title>\n<meta name=\"description\" content=\"Loading the multi-file visitor chat JavaScript api with a non-namespaced version of RequireJS co-existing with the web page&#039;s own RequireJS version.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.yalst.de\/en\/requirejs-and-yalst-live-chat-javascript-api\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Configure RequireJS to load the yalst live chat JavaScript Api\" \/>\n<meta property=\"og:description\" content=\"Loading the multi-file visitor chat JavaScript api with a non-namespaced version of RequireJS co-existing with the web page&#039;s own RequireJS version.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.yalst.de\/en\/requirejs-and-yalst-live-chat-javascript-api\/\" \/>\n<meta property=\"og:site_name\" content=\"yalst - Live Support | Live Chat | Live Help | Help Desk\" \/>\n<meta property=\"article:published_time\" content=\"2013-11-06T15:49:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2015-05-28T21:46:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.yalst.de\/wp-content\/uploads\/2015\/04\/NoConflictLoadingNetworkLog.png\" \/>\n<meta name=\"author\" content=\"Matthias Seemann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Matthias Seemann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.yalst.de\/en\/requirejs-and-yalst-live-chat-javascript-api\/\",\"url\":\"https:\/\/www.yalst.de\/en\/requirejs-and-yalst-live-chat-javascript-api\/\",\"name\":\"Configure RequireJS to load the yalst live chat JavaScript Api\",\"isPartOf\":{\"@id\":\"https:\/\/www.yalst.de\/en\/#website\"},\"datePublished\":\"2013-11-06T15:49:06+00:00\",\"dateModified\":\"2015-05-28T21:46:44+00:00\",\"author\":{\"@id\":\"https:\/\/www.yalst.de\/en\/#\/schema\/person\/32edfd67d7dc13e809181afe316fcccb\"},\"description\":\"Loading the multi-file visitor chat JavaScript api with a non-namespaced version of RequireJS co-existing with the web page's own RequireJS version.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.yalst.de\/en\/requirejs-and-yalst-live-chat-javascript-api\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.yalst.de\/en\/requirejs-and-yalst-live-chat-javascript-api\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.yalst.de\/en\/requirejs-and-yalst-live-chat-javascript-api\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.yalst.de\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Configure RequireJS to load the yalst live chat JavaScript Api\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.yalst.de\/en\/#website\",\"url\":\"https:\/\/www.yalst.de\/en\/\",\"name\":\"yalst - Live Support | Live Chat | Live Help | Help Desk\",\"description\":\"Ihr umfassender Live Support Chat\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.yalst.de\/en\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.yalst.de\/en\/#\/schema\/person\/32edfd67d7dc13e809181afe316fcccb\",\"name\":\"Matthias Seemann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.yalst.de\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/6d883a962ac315cf385799a15783f440?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/6d883a962ac315cf385799a15783f440?s=96&d=mm&r=g\",\"caption\":\"Matthias Seemann\"},\"description\":\"Entwickler und Mitglied der Gesch\u00e4ftsf\u00fchrung bei der Visisoft OHG\",\"url\":\"https:\/\/www.yalst.de\/en\/author\/seemannvisisoft-de\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Configure RequireJS to load the yalst live chat JavaScript Api","description":"Loading the multi-file visitor chat JavaScript api with a non-namespaced version of RequireJS co-existing with the web page's own RequireJS version.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.yalst.de\/en\/requirejs-and-yalst-live-chat-javascript-api\/","og_locale":"en_US","og_type":"article","og_title":"Configure RequireJS to load the yalst live chat JavaScript Api","og_description":"Loading the multi-file visitor chat JavaScript api with a non-namespaced version of RequireJS co-existing with the web page's own RequireJS version.","og_url":"https:\/\/www.yalst.de\/en\/requirejs-and-yalst-live-chat-javascript-api\/","og_site_name":"yalst - Live Support | Live Chat | Live Help | Help Desk","article_published_time":"2013-11-06T15:49:06+00:00","article_modified_time":"2015-05-28T21:46:44+00:00","og_image":[{"url":"https:\/\/www.yalst.de\/wp-content\/uploads\/2015\/04\/NoConflictLoadingNetworkLog.png"}],"author":"Matthias Seemann","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Matthias Seemann","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.yalst.de\/en\/requirejs-and-yalst-live-chat-javascript-api\/","url":"https:\/\/www.yalst.de\/en\/requirejs-and-yalst-live-chat-javascript-api\/","name":"Configure RequireJS to load the yalst live chat JavaScript Api","isPartOf":{"@id":"https:\/\/www.yalst.de\/en\/#website"},"datePublished":"2013-11-06T15:49:06+00:00","dateModified":"2015-05-28T21:46:44+00:00","author":{"@id":"https:\/\/www.yalst.de\/en\/#\/schema\/person\/32edfd67d7dc13e809181afe316fcccb"},"description":"Loading the multi-file visitor chat JavaScript api with a non-namespaced version of RequireJS co-existing with the web page's own RequireJS version.","breadcrumb":{"@id":"https:\/\/www.yalst.de\/en\/requirejs-and-yalst-live-chat-javascript-api\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.yalst.de\/en\/requirejs-and-yalst-live-chat-javascript-api\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.yalst.de\/en\/requirejs-and-yalst-live-chat-javascript-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.yalst.de\/en\/"},{"@type":"ListItem","position":2,"name":"Configure RequireJS to load the yalst live chat JavaScript Api"}]},{"@type":"WebSite","@id":"https:\/\/www.yalst.de\/en\/#website","url":"https:\/\/www.yalst.de\/en\/","name":"yalst - Live Support | Live Chat | Live Help | Help Desk","description":"Ihr umfassender Live Support Chat","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.yalst.de\/en\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.yalst.de\/en\/#\/schema\/person\/32edfd67d7dc13e809181afe316fcccb","name":"Matthias Seemann","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.yalst.de\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/6d883a962ac315cf385799a15783f440?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6d883a962ac315cf385799a15783f440?s=96&d=mm&r=g","caption":"Matthias Seemann"},"description":"Entwickler und Mitglied der Gesch\u00e4ftsf\u00fchrung bei der Visisoft OHG","url":"https:\/\/www.yalst.de\/en\/author\/seemannvisisoft-de\/"}]}},"_links":{"self":[{"href":"https:\/\/www.yalst.de\/en\/wp-json\/wp\/v2\/posts\/778"}],"collection":[{"href":"https:\/\/www.yalst.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.yalst.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.yalst.de\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.yalst.de\/en\/wp-json\/wp\/v2\/comments?post=778"}],"version-history":[{"count":19,"href":"https:\/\/www.yalst.de\/en\/wp-json\/wp\/v2\/posts\/778\/revisions"}],"predecessor-version":[{"id":4234,"href":"https:\/\/www.yalst.de\/en\/wp-json\/wp\/v2\/posts\/778\/revisions\/4234"}],"wp:attachment":[{"href":"https:\/\/www.yalst.de\/en\/wp-json\/wp\/v2\/media?parent=778"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.yalst.de\/en\/wp-json\/wp\/v2\/categories?post=778"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.yalst.de\/en\/wp-json\/wp\/v2\/tags?post=778"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}