{"id":39,"date":"2007-10-06T19:34:53","date_gmt":"2007-10-06T19:34:53","guid":{"rendered":"http:\/\/blog.milamberspace.net\/index.php\/jmeter-variabilisation-de-donnees"},"modified":"2012-11-09T17:53:34","modified_gmt":"2012-11-09T17:53:34","slug":"jmeter-variabilisation-de-donnees","status":"publish","type":"page","link":"https:\/\/blog.milamberspace.net\/index.php\/jmeter-pages\/jmeter-variabilisation-de-donnees","title":{"rendered":"JMeter &#8211; Variabilisation de donn\u00e9es"},"content":{"rendered":"<p><strong>Revu et mis \u00e0 jour le 20 juin 2010 avec JMeter 2.4 (version d\u00e9veloppement r\u00e9vision 951940) en version fran\u00e7aise<\/strong>.<\/p>\n<p>Pour ce tutoriel, nous allons voir comment variabiliser des donn\u00e9es saisies par formulaire pour effectuer un tir de charges avec JMeter avec des donn\u00e9es changeantes \u00e0 chaque it\u00e9ration du tir. La variabilisation des donn\u00e9es permet de mieux simuler la diversit\u00e9 de requ\u00eates que l&rsquo;on peut avoir sur un environnement r\u00e9el. Notamment en \u00e9vitant les effets de cache (navigateur, persistance, etc).<\/p>\n<p>Pour ce tutoriel, on suppose que vous avez d\u00e9j\u00e0 effectu\u00e9 le tutoriel sur <a href=\"http:\/\/blog.milamberspace.net\/index.php\/jmeter-test-de-charges-dun-site-web-mode-demploi\" target=\"_blank\">l&rsquo;enregistrement d&rsquo;un sc\u00e9nario fonctionnel dans JMeter<\/a>.<\/p>\n<p>Par ailleurs, on reprend les servlets d&rsquo;exemples de Tomcat 5.5 comme \u00ab site Web mod\u00e8le \u00bb, et on utilise la version<span style=\"text-decoration: line-through;\"> 2.3<\/span> 2.4 (dev) de JMeter.<\/p>\n<p><span style=\"text-decoration: underline;\"><strong>Identification du sc\u00e9nario fonctionnel<\/strong><\/span><\/p>\n<p>La premi\u00e8re \u00e9tape consiste \u00e0 identifier le sc\u00e9nario fonctionnel.<\/p>\n<p><strong><span style=\"text-decoration: underline;\">Ecran 1 :<\/span><\/strong> la page d&rsquo;accueil des servlets d&rsquo;exemples de Tomcat<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" title=\"Ecran 1 : la page d'accueil des servlets d'exemples de Tomcat\" src=\"\/wp-content\/images\/jmeter02-img\/tomcat01.gif\" border=\"1\" alt=\"Ecran 1 : la page d'accueil des servlets d'exemples de Tomcat\" width=\"598\" height=\"372\" \/><\/p>\n<p>On fait d\u00e9filer la page vers le bas, pour voir la liste des servlets disponibles.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" title=\"clique sur le lien Execute de la servlet d'exemple Request Headers\" src=\"\/wp-content\/images\/jmeter02-img\/tomcat02.gif\" border=\"1\" alt=\"clique sur le lien Execute de la servlet d'exemple Request Headers\" width=\"598\" height=\"372\" \/><\/p>\n<p>On clique sur le lien <strong>Execute<\/strong> de la servlet d&rsquo;exemple Request Headers pour arriver sur l&rsquo;\u00e9cran suivant.<\/p>\n<p><strong>Ecran 2 :<\/strong> Formulaire Request Headers<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" title=\"Ecran 2 : Formulaire Request Headers\" src=\"\/wp-content\/images\/jmeter02-img\/tomcat03.gif\" border=\"1\" alt=\"Ecran 2 : Formulaire Request Headers\" width=\"598\" height=\"372\" \/><\/p>\n<p><strong>Ecran 3 :<\/strong> Saisie du nom et pr\u00e9nom.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" title=\"Ecran 3 : Saisie du nom et pr\u00e9nom.\" src=\"\/wp-content\/images\/jmeter02-img\/tomcat04.gif\" border=\"1\" alt=\"Ecran 3 : Saisie du nom et pr\u00e9nom.\" width=\"598\" height=\"372\" \/><\/p>\n<p>Puis on clique sur le bouton <strong>Submit Query<\/strong> pour envoyer les donn\u00e9es du formulaire.<\/p>\n<p><strong>Ecran 4 :<\/strong> R\u00e9sultat du formulaire<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" title=\"Ecran 4 : R\u00e9sultat du formulaire\" src=\"\/wp-content\/images\/jmeter02-img\/tomcat05.gif\" border=\"1\" alt=\"Ecran 4 : R\u00e9sultat du formulaire\" width=\"598\" height=\"372\" \/><\/p>\n<p>Les donn\u00e9es envoy\u00e9es apparaissent en haut dans le formulaire. Ensuite on clique que la fl\u00e8che de retour pour revenir \u00e0 la page d&rsquo;accueil des servlets de test de Tomcat.<\/p>\n<p><strong>Ecran 5 :<\/strong> Retour \u00e0 la page d&rsquo;accueil<\/p>\n<p style=\"margin-bottom: 0cm;\"><img loading=\"lazy\" decoding=\"async\" title=\"Ecran 5 : Retour \u00e0 la page d'accueil\" src=\"\/wp-content\/images\/jmeter02-img\/tomcat01.gif\" border=\"1\" alt=\"Ecran 5 : Retour \u00e0 la page d'accueil\" width=\"598\" height=\"372\" \/><\/p>\n<p>Et voil\u00e0, nous avons maintenant un sc\u00e9nario fonctionnel. Il reste simple et d\u00e9monstratif. Il reste \u00e0 le \u00ab Jmeteriser \u00bb en suivant la m\u00e9thode de <a href=\"http:\/\/blog.milamberspace.net\/index.php\/jmeter-test-de-charges-dun-site-web-mode-demploi\" target=\"_blank\">ce tutorial (utilisation de l&rsquo;item <strong>HTTP Proxy<\/strong>)<\/a>.<\/p>\n<p>Voici, ci-dessous, le r\u00e9sultat de la Jmeterisation.<\/p>\n<p><img decoding=\"async\" style=\"border: 1px solid black;\" title=\"Sc\u00e9nario du tir\" src=\"\/wp-content\/images\/jmeter02-img\/new\/var01.png\" border=\"1\" alt=\"Sc\u00e9nario du tir\" \/><\/p>\n<p>Allons voir du cot\u00e9 de la <strong>requ\u00eate HTTP<\/strong> <strong>num\u00e9ro 03<\/strong>, correspondant \u00e0 l&rsquo;envoi des donn\u00e9es du formulaire.<\/p>\n<p><img decoding=\"async\" style=\"border: 1px solid black;\" title=\"Exemple de donn\u00e9es envoy\u00e9es par formulaire\" src=\"\/wp-content\/images\/jmeter02-img\/new\/var02.png\" border=\"1\" alt=\"Exemple de donn\u00e9es envoy\u00e9es par formulaire\" \/><\/p>\n<p>On retrouve dans la section <strong>Envoyer les param\u00e8tres avec la requ\u00eate<\/strong>, les param\u00e8tres correspondant aux champs Pr\u00e9nom (firstname) et Nom (lastname) du formulaire. Ce sont ces param\u00e8tres que nous allons \u00ab variabiliser \u00bb.<\/p>\n<p><span style=\"text-decoration: underline;\"><strong>Variabilisation du sc\u00e9nario<\/strong><\/span><\/p>\n<p>Pour variabliser le sc\u00e9nario, nous allons mettre de cot\u00e9 JMeter un instant, et commencer la pr\u00e9paration d&rsquo;un fichier au format CSV (texte s\u00e9par\u00e9 par des virgules). Ce fichier sera \u00ab l&rsquo;input \u00bb de JMeter pour faire tourner la valeur des champs Nom et Pr\u00e9nom.<\/p>\n<p>Pour r\u00e9aliser ce fichier, une m\u00e9thode consiste \u00e0 prendre un tableur comme Excel ou comme ici, Calc d&rsquo;<a href=\"http:\/\/fr.openoffice.org\/\">OpenOffice<\/a>. La premi\u00e8re colonne sera le pr\u00e9nom, et la deuxi\u00e8me colonne sera le nom. (Ici c&rsquo;est une liste de boxeurs.)<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" title=\"La liste dans OpenOffice Calc\" src=\"\/wp-content\/images\/jmeter02-img\/opencalc10.gif\" border=\"1\" alt=\"La liste dans OpenOffice Calc\" width=\"396\" height=\"721\" \/><\/p>\n<p>Une fois que la liste est pr\u00eate, il faut l&rsquo;enregistrer avec le format CSV, en changeant le type du fichier \u00e0 partir de la liste d\u00e9roulante sous le nom du fichier.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" title=\"Nom de fichier et extension CSV\" src=\"\/wp-content\/images\/jmeter02-img\/opencalc11.gif\" border=\"1\" alt=\"Nom de fichier et extension CSV\" width=\"588\" height=\"114\" \/><\/p>\n<p>OpenOffice Calc permet de choisir le charset, le d\u00e9limiteur de champ et le d\u00e9limiteur de texte. On choisira de pr\u00e9f\u00e9rence UTF-8, le d\u00e9limiteur de champ est bien s\u00fbr la virgule et on laissera le champ d\u00e9limiteur de texte \u00e0 vide.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" title=\"Format d'enregistrement du fichier CSV\" src=\"\/wp-content\/images\/jmeter02-img\/opencalc12.gif\" border=\"1\" alt=\"Format d'enregistrement du fichier CSV\" width=\"531\" height=\"206\" \/><\/p>\n<p>Nous avons donc maintenant un fichier CSV pr\u00eat pour \u00eatre l&rsquo;input de Jmeter.<\/p>\n<p>Revenons donc vers JMeter, on s\u00e9lectionne l&rsquo;\u00e9l\u00e9ment <strong>Groupe d&rsquo;unit\u00e9s<\/strong>, et on ajoute un \u00e9l\u00e9ment de configuration <strong>Source de donn\u00e9es CSV<\/strong>.<\/p>\n<p><img decoding=\"async\" style=\"border: 1px solid black;\" title=\"Ajout de l'item CSV Data Set Config\" src=\"\/wp-content\/images\/jmeter02-img\/new\/var03.png\" border=\"1\" alt=\"Ajout de l'item CSV Data Set Config\" \/><\/p>\n<p>L&rsquo;\u00e9l\u00e9ment <strong>Source de donn\u00e9es CSV<\/strong> permet de lire un fichier CSV et de mettre dans une ou plusieurs variables JMeter provenant d&rsquo;une ligne dudit fichier. A chaque it\u00e9ration, la ligne suivante est s\u00e9lectionn\u00e9e.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"border: 1px solid black;\" title=\"Configuration de l'item CSV Data Set Config\" src=\"\/wp-content\/images\/jmeter02-img\/new\/var04.png\" border=\"1\" alt=\"Configuration de l'item CSV Data Set Config\" width=\"850\" height=\"287\" \/><\/p>\n<p>On saisie les valeurs suivantes dans les champs :<\/p>\n<ul>\n<li><strong>Nom de fichier<\/strong> : le chemin absolu et le nom du fichier. (ou bien juste le nom du fichier, auquel cas le fichier doit se trouver dans le classpath de Jmeter. Par exemple : JMETER_HOME\/bin)<\/li>\n<li><strong>Encodage du fichier <\/strong>: Lors de l&rsquo;export du fichier CSV avec Calc, le format UTF-8 a \u00e9t\u00e9 choisi, donc on reprend la m\u00eame chose.<\/li>\n<li><strong>Noms des variables <\/strong>: le nom des variables dans lesquelles JMeter va ins\u00e9rer les \u00e9l\u00e9ments d&rsquo;une ligne. Dans le fichier CSV, la premi\u00e8re colonne \u00e9tait le pr\u00e9nom, la seconde \u00e9tait le nom, donc on saisie \u00ab PRENOM,NOM \u00bb pour avoir dans la variable PRENOM le pr\u00e9nom, et dans la variable NOM le nom.<\/li>\n<li><strong>D\u00e9limiteur<\/strong> : on travaille avec un fichier \u00ab pur \u00bb CSV, et donc c&rsquo;est la virgule qui nous sert de s\u00e9parateur de champ.<\/li>\n<li><strong>Recycler en fichier de fichier ?<\/strong> : Est-ce qu&rsquo;\u00e0 la fin du fichier (End Of File), JMeter reprend la liste depuis le d\u00e9but pour variabiliser les variables ? Oui pour nous.<\/li>\n<li><strong>Arr\u00eater l&rsquo;unit\u00e9 \u00e0 la fin du fichier ? <\/strong>: Est-ce que l&rsquo;\u00e9l\u00e9ment <strong>Groupe d&rsquo;unit\u00e9s <\/strong>dans lequel se trouve l&rsquo;\u00e9l\u00e9ment <strong>Source de donn\u00e9es CSV<\/strong> se stoppe \u00e0 la fin du fichier, quelque soit le nombre d&rsquo;it\u00e9rations pr\u00e9vu ? Non pour nous<\/li>\n<\/ul>\n<p>Maintenant que nous avons compl\u00e9t\u00e9 l&rsquo;\u00e9l\u00e9ment <strong>Source de donn\u00e9es CSV<\/strong>, nous disposons de deux variables pendant l&rsquo;ex\u00e9cution du test de charge. Nous allons les utiliser dans notre sc\u00e9nario de tir. Pour cela, on se positionne sur l&rsquo;\u00e9l\u00e9ment <strong>Requ\u00eate HTTP <span>num\u00e9ro <\/span>03<\/strong>, celui qui correspond \u00e0 l&rsquo;envoi de donn\u00e9es de la servlet Request Param.<\/p>\n<p><img decoding=\"async\" style=\"border: 1px solid black;\" title=\"Mise en place des variables JMeter pour l'insertion des donn\u00e9es\" src=\"\/wp-content\/images\/jmeter02-img\/new\/var05.png\" border=\"1\" alt=\"Mise en place des variables JMeter pour l'insertion des donn\u00e9es\" \/><\/p>\n<p>Dans la zone <strong>Envoyer les param\u00e8tres avec la requ\u00eate<\/strong>, on retrouve les noms HTML des champs du formulaire : <em>firstname<\/em> et <em>lastname<\/em>. Dans la colonne <strong>Valeur<\/strong>, nous allons remplacer les valeurs donn\u00e9es lors de l&rsquo;enregistrement du sc\u00e9nario par : <em>${PRENOM}<\/em> et <em>${NOM}<\/em>. Le ${&#8230;} indique \u00e0 JMeter qu&rsquo;il s&rsquo;agit d&rsquo;une variable, et que lors de l&rsquo;ex\u00e9cution, il faut la remplacer par la valeur de la variable.<\/p>\n<p><em>Allons un peu plus loin<\/em>, pour cela autant v\u00e9rifier que les donn\u00e9es variabilis\u00e9es envoy\u00e9es (beaucoup de \u00ab \u00e9es \u00bb :-)) sont bien celles qui sont affich\u00e9es dans la r\u00e9ponse. Ainsi on va chercher l&rsquo;\u00e9l\u00e9ment <strong>Assertion R\u00e9ponse <\/strong>de l&rsquo;\u00e9l\u00e9ment <strong>Requ\u00eate HTTP<\/strong> num\u00e9ro 03.<\/p>\n<p><img decoding=\"async\" style=\"border: 1px solid black;\" title=\"Configuration du test d'assertion\" src=\"\/wp-content\/images\/jmeter02-img\/new\/var06.png\" border=\"1\" alt=\"Configuration du test d'assertion\" \/><\/p>\n<p>En utilisant le bouton <strong>Ajouter<\/strong>, on va ajouter deux <strong>Motifs \u00e0 tester<\/strong> : <em>${PRENOM}<\/em> et <em>${NOM}<\/em> tout simplement. Si JMeter trouve les deux dans la r\u00e9ponse HTML re\u00e7ue, alors l&rsquo;assertion est OK.<\/p>\n<p><span style=\"text-decoration: underline;\"><strong>Ex\u00e9cution du tir<\/strong><\/span><\/p>\n<p>Et voil\u00e0, maintenant nous sommes pr\u00eat pour ex\u00e9cuter le tir. On se place sur l&rsquo;\u00e9l\u00e9ment <strong>Groupe d&rsquo;unit\u00e9s<\/strong>, on choisit les param\u00e8tres du <strong>Groupe d&rsquo;unit\u00e9s<\/strong>, ici un seul utilisateur virtuel, sur une p\u00e9riode de mont\u00e9e en charge de 1 sec, qui va ex\u00e9cuter 400 fois le sc\u00e9nario.<\/p>\n<p><img decoding=\"async\" style=\"border: 1px solid black;\" title=\"Configuration du tir de charges\" src=\"\/wp-content\/images\/jmeter02-img\/new\/var07.png\" border=\"1\" alt=\"Configuration du tir de charges\" \/><\/p>\n<p>On lance le tir, avec le raccourci clavier <strong>Ctrl + R<\/strong> (ou le menu <strong>Lancer &gt; D\u00e9marrer<\/strong>),  le r\u00e9sultat (ci-dessous) visible sur l&rsquo;\u00e9l\u00e9ment <strong>Rapport consolid\u00e9<\/strong> :<\/p>\n<p><img decoding=\"async\" style=\"border: 1px solid black;\" title=\"Rapport d'ex\u00e9cution du tir\" src=\"\/wp-content\/images\/jmeter02-img\/new\/var09.png\" border=\"1\" alt=\"Rapport d'ex\u00e9cution du tir\" \/><\/p>\n<p>On note qu&rsquo;il n&rsquo;y a pas d&rsquo;erreurs dans le tir, notamment sur la <strong>Requ\u00eate HTTP <\/strong>num\u00e9ro 03. On peut aussi v\u00e9rifier que tout s&rsquo;est bien pass\u00e9 en allant voir l&rsquo;\u00e9l\u00e9ment <strong>Arbre de r\u00e9sultats<\/strong>.<\/p>\n<p><img decoding=\"async\" style=\"border: 1px solid black;\" title=\"R\u00e9ponse HTML d'un premier cas\" src=\"\/wp-content\/images\/jmeter02-img\/new\/var10.png\" border=\"1\" alt=\"R\u00e9ponse HTML d'un premier cas\" \/><\/p>\n<p>En choisissant au hasard une requ\u00eate 03, dans l&rsquo;onglet <strong>Donn\u00e9es de r\u00e9ponse<\/strong>, on retrouve bien le nom d&rsquo;un boxeur au lieu des variables <em>${PRENOM}<\/em> et <em>${NOM}<\/em>.<\/p>\n<p><img decoding=\"async\" style=\"border: 1px solid black;\" title=\"R\u00e9ponse HTML d'un deuxi\u00e8me cas\" src=\"\/wp-content\/images\/jmeter02-img\/new\/var11.png\" border=\"1\" alt=\"R\u00e9ponse HTML d'un deuxi\u00e8me cas\" \/><\/p>\n<p>Et si on va sur une autre requ\u00eate 03, le pr\u00e9nom et le nom sont bien diff\u00e9rents. C&rsquo;est gagn\u00e9, la variabilisation marche ! (mais qui en doutait ?). Nous avons vu dans ce petit tutoriel comment variabiliser les donn\u00e9es entr\u00e9es par formulaire dans un site Web.<\/p>\n<p><span style=\"text-decoration: underline;\"><strong>Quelques remarques :<\/strong><\/span><\/p>\n<p>L&rsquo;\u00e9l\u00e9ment <strong>Source de donn\u00e9es CSV<\/strong> est tr\u00e8s pratique pour cette action, mais d&rsquo;autres moyens permettent de faire la m\u00eame chose, cependant plus difficilement (en l&rsquo;occurrence, il s&rsquo;agit des fonctions JMeter <strong>__CSVRead()<\/strong> et <strong>__StringFromFile()<\/strong>).<\/p>\n<p>Ce tutoriel montre la variabilisation \u00e0 partir de donn\u00e9es \u00ab connues \u00bb avant le tir. Il est aussi possible de variabiliser un sc\u00e9nario de tir avec des donn\u00e9es<br \/>\nretrouv\u00e9es (ou calcul\u00e9es) dynamiquement pendant l&rsquo;ex\u00e9cution du tir. (On utilisera en autre l&rsquo;\u00e9l\u00e9ment <strong>Extracteur d&rsquo;expression r\u00e9guli\u00e8re <\/strong>du groupe<strong> Post-processeurs<\/strong> pour ce genre de cas. <a href=\"http:\/\/blog.milamberspace.net\/index.php\/2009\/12\/31\/quelques-cas-dutilisation-de-lextracteur-dexpression-reguliere-dans-jmeter-554.html\">Voir ce billet<\/a>)<\/p>\n<p><span style=\"text-decoration: underline;\"><strong>La petite astuce de la fin :<\/strong><\/span><\/p>\n<p>JMeter poss\u00e8de un fichier principal de param\u00e8tres, plac\u00e9 dans JMETER_HOME\/bin. Ce fichier s&rsquo;appelle <em>jmeter.properties<\/em>. Vous trouverez dedans le param\u00e8tre <strong>proxy.number.requests <\/strong>qui permet d&rsquo;avoir une num\u00e9rotation automatique des \u00e9l\u00e9ments <strong>Requ\u00eate HTTP <\/strong>lors d&rsquo;un enregistrement via l&rsquo;\u00e9l\u00e9ment <strong>Proxy HTTP<\/strong>. Il faut donner la valeur <em>true<\/em> pour avoir la num\u00e9rotation automatique, et red\u00e9marrer JMeter.<\/p>\n<p><em>proxy.number.requests=true<\/em><\/p>\n<p>A bient\u00f4t pour de nouvelles aventures&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Revu et mis \u00e0 jour le 20 juin 2010 avec JMeter 2.4 (version d\u00e9veloppement r\u00e9vision 951940) en version fran\u00e7aise. Pour ce tutoriel, nous allons voir comment variabiliser des donn\u00e9es saisies par formulaire pour effectuer un tir de charges avec JMeter avec des donn\u00e9es changeantes \u00e0 chaque it\u00e9ration du tir. La variabilisation des donn\u00e9es permet de &hellip; <a href=\"https:\/\/blog.milamberspace.net\/index.php\/jmeter-pages\/jmeter-variabilisation-de-donnees\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">JMeter &#8211; Variabilisation de donn\u00e9es<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":85,"menu_order":4,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-39","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/pages\/39","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/comments?post=39"}],"version-history":[{"count":8,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/pages\/39\/revisions"}],"predecessor-version":[{"id":1243,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/pages\/39\/revisions\/1243"}],"up":[{"embeddable":true,"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/pages\/85"}],"wp:attachment":[{"href":"https:\/\/blog.milamberspace.net\/index.php\/wp-json\/wp\/v2\/media?parent=39"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}