{"id":1867,"date":"2017-09-11T00:00:00","date_gmt":"2017-09-10T22:00:00","guid":{"rendered":"https:\/\/wwwneu.strehle.de\/tim\/weblog\/archives\/2017\/09\/11\/1626-2\/"},"modified":"2025-07-31T21:45:09","modified_gmt":"2025-07-31T19:45:09","slug":"1626-2","status":"publish","type":"post","link":"https:\/\/www.strehle.de\/tim\/weblog\/archives\/2017\/09\/11\/1626-2\/","title":{"rendered":"Web frontend integration: Just drop me a link"},"content":{"rendered":"\n<p>For two reasons, I think about <strong>software interoperability<\/strong> a lot (see <a href=\"http:\/\/digitalassetmanagementnews.org\/improving-dam-interoperability-in-2017\/\">Improving DAM Interoperability in 2017<\/a>): First, software \u2013 especially \u201ccontent hub\u201d-style DAM systems \u2013 must work well with other software to help people do their jobs. The second reason is that when we consider <a href=\"\/tim\/weblog\/archives\/2016\/01\/20\/1584\">splitting a monolithic (DAM) system into multiple smaller <strong>Self-Contained Systems<\/strong><\/a>, these parts need to interoperate with each other, too.<\/p>\n\n\n\n<p>A very interesting aspect of interoperability is <strong>frontend integration<\/strong>: When in application A, people need access to information living in application B. How do they navigate from A to B? Can they see both application\u2019s interrelated data on the same screen? I wrote about this in <a href=\"\/tim\/weblog\/archives\/2014\/07\/18\/1729\">Web app interoperability \u2013 the missing link<\/a>. Now it\u2019s time for a few experiments.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Web sites can talk to each other<\/h3>\n\n\n\n<p>You know the thing Facebook, Twitter or LinkedIn do when you paste a link into them \u2013 they magically add a title and an image:<\/p>\n\n\n\n<figure class=\"wp-block-video\"><\/figure>\n\n\n\n<p>That \u201cmagic\u201d is simply them fetching the Web page you\u2019re linking to, and reading structured metadata from its HTML source code using the <a href=\"http:\/\/ogp.me\">Open Graph protocol<\/a> or <a href=\"https:\/\/dev.twitter.com\/cards\/overview\">Twitter cards markup<\/a>.<\/p>\n\n\n\n<p>Here\u2019s the Open Graph data LinkedIn reads from my homepage\u2019s HTML head meta tags in the screencast above:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;meta property=\"og:title\" content=\"Tim Strehle\" \/&gt;\n&lt;meta property=\"og:description\" content=\"Digital Asset Management\u2026\" \/&gt;\n&lt;meta property=\"og:image\" content=\"https:\/\/www.strehle.de\/tim\/Tim_Strehle_2015.jpg\" \/&gt;\n<\/code><\/pre>\n\n\n\n<p>This is a simple but powerful integration pattern which we can use to transport arbitrary structured data between Web pages. <strong>In the experiment shown below<\/strong>, I\u2019m filling in a registration form just by dropping my homepage URL onto it:<\/p>\n\n\n\n<figure class=\"wp-block-video\"><\/figure>\n\n\n\n<p>The data is standard-conformant <a href=\"http:\/\/schema.org\">schema.org markup<\/a> embedded in the HTML body of my homepage. An excerpt:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;span class=\"start-tag\">p&lt;\/span>I work for the &lt;span class=\"start-tag\">a&lt;\/span> &lt;span class=\"attribute-name\">href&lt;\/span>=\"&lt;a class=\"attribute-value\">http:\/\/www.spiegelgruppe.de\/&lt;\/a>\" \n &lt;span class=\"attribute-name\">property&lt;\/span>=\"&lt;a class=\"attribute-value\">schema:worksFor&lt;\/a>\" &lt;span class=\"attribute-name\">typeof&lt;\/span>=\"&lt;a class=\"attribute-value\">schema:Organization&lt;\/a>\">\n&lt;&lt;span class=\"start-tag\">span&lt;\/span> &lt;span class=\"attribute-name\">property&lt;\/span>=\"&lt;a class=\"attribute-value\">schema:name&lt;\/a>\">SPIEGEL Verlag&lt;\/&lt;span class=\"end-tag\">span&lt;\/span>>&lt;\/&lt;span class=\"end-tag\">a&lt;\/span>> \nas \u201c&lt;&lt;span class=\"start-tag\">span&lt;\/span> &lt;span class=\"attribute-name\">property&lt;\/span>=\"&lt;a class=\"attribute-value\">schema:jobTitle&lt;\/a>\">Project Manager \nDigital Asset Management Systems&lt;\/&lt;span class=\"end-tag\">span&lt;\/span>>\u201d. &lt;\/&lt;span class=\"end-tag\">p&lt;\/span>>\n&lt;span id=\"line61\">&lt;\/span>\n<\/code><\/pre>\n\n\n\n<p><strong>In the next experiment<\/strong>, I\u2019m showing a hypothetical application requiring email address input to be able to share something with other people. The first address is manually entered, lacking any additional information about that person. The second address is entered by pasting a URL \u2013 which, instead of my homepage again, could be a deep link into your CRM or any other Web app holding information about people. Once again, structured metadata is fetched from that URL, and suddenly we know a lot more about that person and even have a link to follow:<\/p>\n\n\n\n<figure class=\"wp-block-video\"><\/figure>\n\n\n\n<p>We can add a lot more features to our UI \u2013 do client-side \u201clink replacement\u201d, open a \u201cpicker\u201d dialog to let people search instead of having to paste or drop a URL, or even add an iFrame or <a href=\"http:\/\/webagility.com\/posts\/web-components-vs-iframes\">Web Component<\/a> to embed another application\u2019s information. If you\u2019re interested in these topics and you speak German, InnoQ\u2019s Falk Hoppe, Till Schulte-Coerne and Eberhard Wolff did a great podcast on <a href=\"https:\/\/www.innoq.com\/de\/podcast\/025-scs-frontend-integration\/\">Self-contained Systems und Frontend-Integration [in German]<\/a> (see also <a href=\"https:\/\/www.innoq.com\/de\/podcast\/026-scs-frontend-integration-teil-2\/\">part 2<\/a>).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Linked Data<\/h3>\n\n\n\n<p>The URLs used above for linking can become truly magical if you\u2019re doing them right:<\/p>\n\n\n\n<p>Let every piece of software you\u2019re running that holds important information make that information available<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>under a stable, shareable URL<\/li>\n\n\n\n<li>which displays a nice, human-readable HTML representation<\/li>\n\n\n\n<li>with links to related information<\/li>\n\n\n\n<li>and structured metadata embedded as shown above<\/li>\n\n\n\n<li>plus all of the item data in machine-readable form, i.e. in the software\u2019s Web Service API, either being linked to or accessible via content negotiation (\u201cI can give you JSON or XML data if you ask for it\u201d).<\/li>\n<\/ul>\n\n\n\n<p>Now both people and software can <a href=\"\/tim\/weblog\/archives\/2013\/05\/08\/1602\">identify<\/a>, access and link to all of the company\u2019s relevant information. Each system uses these URLs when referencing another system\u2019s data. <a href=\"\/tim\/weblog\/archives\/2015\/11\/25\/1576\">Semantic Web<\/a>, here we come \ud83d\ude42<\/p>\n\n\n\n<p>What do you think? Are you doing this already? I\u2019d love to hear your thoughts!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>For two reasons, I think about software interoperability a lot (see Improving DAM Interoperability in 2017): First, software \u2013 especially \u201ccontent hub\u201d-style DAM systems \u2013 must work well with other software to help people do their jobs. The second reason is that when we consider splitting a monolithic (DAM) system into multiple smaller Self-Contained Systems, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_share_on_mastodon":"0"},"categories":[1],"tags":[],"class_list":["post-1867","post","type-post","status-publish","format-standard","hentry","category-weblog"],"share_on_mastodon":{"url":"","error":""},"_links":{"self":[{"href":"https:\/\/www.strehle.de\/tim\/wp-json\/wp\/v2\/posts\/1867","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.strehle.de\/tim\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.strehle.de\/tim\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.strehle.de\/tim\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.strehle.de\/tim\/wp-json\/wp\/v2\/comments?post=1867"}],"version-history":[{"count":3,"href":"https:\/\/www.strehle.de\/tim\/wp-json\/wp\/v2\/posts\/1867\/revisions"}],"predecessor-version":[{"id":1897,"href":"https:\/\/www.strehle.de\/tim\/wp-json\/wp\/v2\/posts\/1867\/revisions\/1897"}],"wp:attachment":[{"href":"https:\/\/www.strehle.de\/tim\/wp-json\/wp\/v2\/media?parent=1867"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.strehle.de\/tim\/wp-json\/wp\/v2\/categories?post=1867"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.strehle.de\/tim\/wp-json\/wp\/v2\/tags?post=1867"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}