{"id":468,"date":"2020-08-08T11:29:27","date_gmt":"2020-08-08T03:29:27","guid":{"rendered":"http:\/\/123.57.164.21\/?p=468"},"modified":"2020-08-08T11:30:01","modified_gmt":"2020-08-08T03:30:01","slug":"swagger%e7%ae%80%e4%bb%8b","status":"publish","type":"post","link":"https:\/\/92it.top\/?p=468","title":{"rendered":"Swagger\u7b80\u4ecb"},"content":{"rendered":"\n<p>Swagger \u662f\u4e00\u4e2a\u89c4\u8303\u548c\u5b8c\u6574\u7684\u6846\u67b6\uff0c\u7528\u4e8e\u751f\u6210\u3001\u63cf\u8ff0\u3001\u8c03\u7528\u548c\u53ef\u89c6\u5316 RESTful \u98ce\u683c\u7684 Web \u670d\u52a1\u3002\u63d0\u4f9bRESTFUL\u63a5\u53e3\u7684\u6587\u6863\u5728\u7ebf\u81ea\u52a8\u751f\u6210+\u529f\u80fd\u6d4b\u8bd5\u529f\u80fd\u8f6f\u4ef6\u3002<\/p>\n\n\n\n<ul><li>\u63a5\u53e3\u7684\u6587\u6863\u5728\u7ebf\u81ea\u52a8\u751f\u6210\u3002<\/li><li>\u529f\u80fd\u6d4b\u8bd5\u3002<\/li><\/ul>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p><strong>\u4f7f\u7528\u4f8b\u5b50<\/strong><\/p>\n\n\n\n<p>    1. maven\u5bfc\u5165Swagger<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;dependency>\n      &lt;groupId>io.springfox&lt;\/groupId>\n      &lt;artifactId>springfox-swagger2&lt;\/artifactId>\n      &lt;version>2.6.1&lt;\/version>\n&lt;\/dependency>\n&lt;dependency>\n     &lt;groupId>io.springfox&lt;\/groupId>\n     &lt;artifactId>springfox-swagger-ui&lt;\/artifactId>\n     &lt;version>2.6.1&lt;\/version>\n&lt;\/dependency><\/pre>\n\n\n\n<p>   2. \u521b\u5efaSwagger\u914d\u7f6e\u7c7b<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/**\n * @program: jpademo\n * @description: Swagger\n * @author: ZengGuangfu\n * @create 2018-10-24 10:12\n *\/\n\u200b\n@Configuration\n@EnableSwagger2\npublic class Swagger {\n\u200b\n   @Bean\n   public Docket docket(){\n       return new Docket(DocumentationType.SWAGGER_2)\n         .apiInfo(apiInfo())\n         .select()\n         .apis(RequestHandlerSelectors.basePackage(\"com.example.springbootjpa.jpademo.controller\"))\n         .paths(PathSelectors.any())\n         .build();\n   }\n\u200b\n   public ApiInfo apiInfo(){\n       return new ApiInfoBuilder()\n         .title(\"\u5229\u7528swagger2\u6784\u5efa\u7684API\u6587\u6863\")\n         .description(\"\u7528restful\u98ce\u683c\u5199\u63a5\u53e3\")\n         .termsOfServiceUrl(\"\")\n         .version(\"1.0\")\n         .build();\n   }\n}\n\/\/ \u5982\u4e0a\u6240\u793a\uff0cdocket() \u65b9\u6cd5\u521b\u5efaDocket\u7684Bean\u5bf9\u8c61\uff0capiInfo()\u5219\u662f\u521b\u5efaApiInfo \u7684\u57fa\u672c\u4fe1\u606f\u3002<\/pre>\n\n\n\n<p><strong>\u6ce8\u89e3\u53ca\u5176\u8bf4\u660e<\/strong><\/p>\n\n\n\n<ul><li>@Api : \u7528\u5728\u7c7b\u4e0a\uff0c\u8bf4\u660e\u8be5\u7c7b\u7684\u4e3b\u8981\u4f5c\u7528\u3002<\/li><li>@ApiOperation\uff1a\u7528\u5728\u65b9\u6cd5\u4e0a\uff0c\u7ed9API\u589e\u52a0\u65b9\u6cd5\u8bf4\u660e\u3002<\/li><li>@ApiImplicitParams : \u7528\u5728\u65b9\u6cd5\u4e0a\uff0c\u5305\u542b\u4e00\u7ec4\u53c2\u6570\u8bf4\u660e\u3002<\/li><li>@ApiImplicitParam\uff1a\u7528\u6765\u6ce8\u89e3\u6765\u7ed9\u65b9\u6cd5\u5165\u53c2\u589e\u52a0\u8bf4\u660e\u3002<\/li><li>@ApiResponses\uff1a\u7528\u4e8e\u8868\u793a\u4e00\u7ec4\u54cd\u5e94\u3002<\/li><li>@ApiResponse\uff1a\u7528\u5728@ApiResponses\u4e2d\uff0c\u4e00\u822c\u7528\u4e8e\u8868\u8fbe\u4e00\u4e2a\u9519\u8bef\u7684\u54cd\u5e94\u4fe1\u606f<\/li><li>@ApiModel\uff1a\u7528\u5728\u8fd4\u56de\u5bf9\u8c61\u7c7b\u4e0a\uff0c\u63cf\u8ff0\u4e00\u4e2aModel\u7684\u4fe1\u606f\uff08\u4e00\u822c\u7528\u5728\u8bf7\u6c42\u53c2\u6570\u65e0\u6cd5\u4f7f\u7528@ApiImplicitParam\u6ce8\u89e3\u8fdb\u884c\u63cf\u8ff0\u7684\u65f6\u5019\uff09<\/li><li><\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/123.57.164.21\/wp-content\/uploads\/2020\/08\/image-17-1024x711.png\" alt=\"\" class=\"wp-image-470\" width=\"572\" height=\"396\" srcset=\"https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-17-1024x711.png 1024w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-17-300x208.png 300w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-17-768x533.png 768w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-17-830x576.png 830w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-17-230x160.png 230w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-17-350x243.png 350w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-17-480x333.png 480w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-17.png 1446w\" sizes=\"(max-width: 572px) 100vw, 572px\" \/><\/figure><\/div>\n\n\n\n<p>\u4ee5\u4e0b\u4ec5\u4ec5\u662f\u4e00\u4e2a\u4f8b\u5b50\uff0c\u5176\u5b9e\u6211\u4e2a\u4eba\u5728\u5f00\u53d1\u4e2d\u5f88\u5c11\u4f7f\u7528@ApiImplicitParam \u4f5c\u4e3a\u53c2\u6570\u7684\u63cf\u8ff0\uff0c\u8fd9\u6837\u63cf\u8ff0\u5728\u53c2\u6570\u8fc7\u591a\u7684\u6761\u4ef6\u4e0b\u4f1a\u6709\u70b9\u9ebb\u70e6\u3002\u4e2a\u4eba\u4e00\u822c\u662f\u5c06\u53c2\u6570\u5c01\u88c5\u4e3a\u4e00\u4e2a\u5b8c\u6574\u5bf9\u8c61\uff08\u7279\u522b\u662fGET\u65b9\u6cd5\uff09\uff0c\u5e76\u5229\u7528@ApiModel\u6ce8\u89e3\u53bb\u5b9a\u4e49\u53c2\u6570\uff0c\u5982\u679c\u4e0d\u9700\u8981\u4f5c\u4e3a\u67e5\u8be2\u6761\u4ef6\u7684\uff0c\u5219\u52a0\u4e00\u4e2ahidden = true\uff0c\u5982\u679c\u662f\u5fc5\u586b\u5c5e\u6027\uff0c\u5219\u589e\u52a0\u4e00\u4e2arequired = true\u5373\u53ef\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\n\/**\n * @program: jpademo\n * @description: EmployeeController\n * @author: ZengGuangfu\n * @create 2018-10-23 11:07\n *\/\n\u200b\n@RestController\n@RequestMapping(\"emp\")\n@Api(value = \"\u7528\u6237\u7ba1\u7406\u7c7b\")\npublic class EmployeeController {\n\u200b\n @Autowired\n private EmployeeReposiroty employeeReposiroty;\n\u200b\n      \/**\n      * \u589e\u52a0\u4eba\u7269\n      * @param employee\n      * @return\n      *\/\n     @PostMapping(value = \"employee\")\n     @ApiOperation(value = \"\u65b0\u589e\u4e00\u4e2a\u7528\u6237\",notes = \"\u65b0\u589e\u4e4b\u540e\u8fd4\u56de\u5bf9\u8c61\")\n     @ApiImplicitParam(paramType = \"query\",name = \"employee\",value = \"\u7528\u6237\",required = true)\n     @ApiResponse(code = 400,message = \"\u53c2\u6570\u6ca1\u6709\u586b\u597d\",response = String.class)\n     public String insert(Employee employee){\n         Employee employee1 = employeeReposiroty.save(employee);\n         if(employee1 != null) {\n             return SysNode.Judge.SUCCESS.getResult();\n         }else {\n             return SysNode.Judge.FAILD.getResult();\n         }\n     }\n\u200b\n      \/**\n      * \u5220\u9664\u5355\u4e2a\u7528\u6237\n      * @param id\n      * @return\n      *\/\n      @DeleteMapping(value = \"employee\/{id}\")\n      @ApiOperation(value = \"\u5220\u9664\u7528\u6237\",notes = \"\u6839\u636e\u6210\u5458id\u5220\u9664\u5355\u4e2a\u7528\u6237\")\n      @ApiImplicitParam(paramType = \"path\",name = \"id\",value = \"\u7528\u6237id\",required = true,dataType = \"Integer\")\n      @ApiResponse(code = 400,message = \"\u53c2\u6570\u6ca1\u6709\u586b\u597d\",response = String.class)\n      public String delete(@PathVariable(\"id\")Integer id){\n           try{\n                employeeReposiroty.deleteById(id);\n                return SysNode.Judge.SUCCESS.getResult();\n           }catch (Exception e){\n                e.printStackTrace();\n               return SysNode.Judge.FAILD.getResult();\n           }\n      }\n\u200b\n      \/**\n      * \u4fee\u6539\u5355\u4e2a\u6210\u5458\n      * @param employee\n      * @return\n      *\/\n      @PutMapping(value = \"employee\/{id}\")\n      @ApiOperation(value = \"\u4fee\u6539\u7528\u6237\u4fe1\u606f\",notes = \"\u6839\u636e\u6210\u5458id\u4fee\u6539\u5355\u4e2a\u7528\u6237\")\n      public String update(Employee employee){\n           \/**\n           * save\u65b9\u6cd5\u5982\u679c\u53c2\u6570\u5c5e\u6027\u7f3a\u5931\uff0c\u4f1a\u5bfc\u81f4\u539f\u672c\u5b58\u5728\u7684\u6570\u636e\u4e3anull\n           *\/\n           Employee employee1 = employeeReposiroty.saveAndFlush(employee);\n           if (employee1 != null) {\n                return SysNode.Judge.SUCCESS.getResult();\n           }else {\n               return SysNode.Judge.FAILD.getResult();\n           }\n      }\n\u200b\n      \/**\n      * \u83b7\u53d6\u6240\u6709\u6210\u5458,\u5347\u5e8f\u6392\u5217\n      * @return\n      *\/\n      @GetMapping(value = \"employee\/sort\")\n      @ApiOperation(value = \"\u67e5\u8be2\u5168\u90e8\u7528\u6237\",notes = \"\u9ed8\u8ba4\u6839\u636e\u5347\u5e8f\u67e5\u8be2\u5168\u90e8\u7528\u6237\u4fe1\u606f\")\n      public List&lt;Employee> findAll(){\n           Sort orders = new Sort(Sort.Direction.DESC,\"employeeId\");\n           List&lt;Employee> employeeList = employeeReposiroty.findAll(orders);\n           return employeeList;\n      }\n\u200b\n      \/**\n     * \u83b7\u53d6\u6240\u6709\u6210\u5458,\u5347\u5e8f\u6392\u5217\n     * @return\n      *\/\n      @GetMapping(value = \"employee\/pageSort\")\n      @ApiOperation(value = \"\u67e5\u8be2\u7528\u6237\u4fe1\u606f\",notes = \"\u67e5\u8be2\u7528\u6237\u4fe1\u606f\")\n      @ApiImplicitParams({\n           @ApiImplicitParam(paramType = \"query\",name = \"sort\",value = \"\u6392\u5e8f\u65b9\u5f0f:asc|desc\",dataType = \"String\",required = true),\n           @ApiImplicitParam(paramType = \"query\",name = \"pagenumber\",value = \"\u7b2c\u51e0\u9875\",dataType = \"Integer\",required = true),\n           @ApiImplicitParam(paramType = \"query\",name = \"pageSize\",value = \"\u5206\u9875\u6570\",dataType = \"Integer\",required = true)\n      })\n      public List&lt;Employee> findAllByPage(String sort,Integer pagenumber,Integer pageSize){\n           try {\n                Sort.Direction sortlast;\n                if(\"desc\".equals(sort.toLowerCase())){\n                     sortlast = Sort.Direction.DESC;\n               }else{          \n                      sortlast = Sort.Direction.ASC;\n               }\n                     Sort orders = new Sort(sortlast, \"employeeId\");\n                     Pageable pageable = new PageRequest(pagenumber, pageSize, orders);\n\u200b\n                     Page&lt;Employee> employeePage = employeeReposiroty.findAll(pageable);\n                     List&lt;Employee> employeeList = employeePage.getContent();\n                     return employeeList;\n           }catch (Exception e){\n                e.printStackTrace();\n                return null;\n           }\n      }\n    \/**\n     * \u81ea\u5b9a\u4e49\u62d3\u5c55jpa\uff0c\u6839\u636e\u7528\u6237\u540d\u67e5\u627e\u5355\u4e2a\u7528\u6237\n     * @param username\n     * @return\n     *\/\n     @GetMapping(value = \"employee\/find\/{username}\")\n     @ApiOperation(value = \"\u67e5\u8be2\u7528\u6237\u4fe1\u606f\",notes = \"\u6839\u636e\u7528\u6237\u767b\u5f55\u540d\u67e5\u8be2\u8be5\u7528\u6237\u4fe1\u606f\")\n     @ApiImplicitParam(paramType = \"path\",name = \"username\",value = \"\u7528\u6237\u767b\u5f55\u540d\",required = true,dataType = \"String\")\n     public Employee findByUsername(@PathVariable(\"username\") String username){\n         List&lt;Employee> employeeList = employeeReposiroty.findByUserNameOrderByEmployeeIdAsc(username);\n         if (employeeList != null &amp;&amp; !employeeList.isEmpty()){\n             return employeeList.get(0);\n         }\n         return null;\n     }\n\u200b\n     \/**\n     * \u6d4b\u8bd5\u7528\n     * @return\n     *\/\n     @GetMapping(value = \"employee\/grade\")\n     public List&lt;Object[]> findEmployeeAndGrade(){\n         Pageable pageable = new PageRequest(0,3);\n\u200b\n         Page&lt;Object[]> page = employeeReposiroty.findEmployeeAndGrade(pageable);\n         System.out.println(page.getTotalElements()+\"----------\u7ed3\u679c\u603b\u6570------------\");\n         System.out.println(page.getTotalPages()+\"--------\u6839\u636epageSize\u7684\u603b\u9875\u6570-----------\");\n         System.out.println(page.getNumber()+\"--------\u5f53\u524d\u9875\u6570\uff0cpageNumber----------\");\n         System.out.println(page.getNumberOfElements()+\"--------\u5f53\u524d\u9875\u6709\u51e0\u4e2a\u6570\u636e--------\");\n         System.out.println(page.getSize()+\"---------PageSize-------------\");\n         System.out.println(page.getSort()+\"---------\u6392\u5e8f\u65b9\u5f0f\uff0c\u6ca1\u6709\u5219\u662f'UNSORTED'----------\");\n\u200b\n         List&lt;Object[]> objects = page.getContent();\n         return objects;\n    }\n}<\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p><strong>\u6d4b\u8bd5\u767b\u5f55 localhost:8080\/swagger-ui.html<\/strong><\/p>\n\n\n\n<ul><li>\u5229\u7528swagger\u751f\u6210\u7684API\u6587\u6863<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/123.57.164.21\/wp-content\/uploads\/2020\/08\/image-18-1024x529.png\" alt=\"\" class=\"wp-image-471\" width=\"584\" height=\"301\" srcset=\"https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-18-1024x529.png 1024w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-18-300x155.png 300w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-18-768x397.png 768w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-18-1536x794.png 1536w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-18-2048x1058.png 2048w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-18-830x429.png 830w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-18-230x119.png 230w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-18-350x181.png 350w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-18-480x248.png 480w\" sizes=\"(max-width: 584px) 100vw, 584px\" \/><figcaption>\u5229\u7528swagger\u751f\u6210\u7684API\u6587\u6863<\/figcaption><\/figure><\/div>\n\n\n\n<ul><li>\u5229\u7528swagger\u5bf9API \u64cd\u4f5c\u6d4b\u8bd5\u3002<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/123.57.164.21\/wp-content\/uploads\/2020\/08\/image-19-1024x663.png\" alt=\"\" class=\"wp-image-472\" width=\"561\" height=\"363\" srcset=\"https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-19-1024x663.png 1024w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-19-300x194.png 300w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-19-768x498.png 768w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-19-830x538.png 830w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-19-230x149.png 230w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-19-350x227.png 350w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-19-480x311.png 480w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-19.png 1352w\" sizes=\"(max-width: 561px) 100vw, 561px\" \/><figcaption>swagger\u63d0\u4f9b\u7684web\u9875\u9762\u7528\u6765\u6d4b\u8bd5API\u63a5\u53e3<\/figcaption><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/123.57.164.21\/wp-content\/uploads\/2020\/08\/image-20-1024x649.png\" alt=\"\" class=\"wp-image-473\" width=\"555\" height=\"351\" srcset=\"https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-20-1024x649.png 1024w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-20-300x190.png 300w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-20-768x486.png 768w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-20-830x526.png 830w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-20-230x146.png 230w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-20-350x222.png 350w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-20-480x304.png 480w, https:\/\/92it.top\/wp-content\/uploads\/2020\/08\/image-20.png 1364w\" sizes=\"(max-width: 555px) 100vw, 555px\" \/><figcaption>\u6d4b\u8bd5\u7ed3\u679c\u9875\u9762<\/figcaption><\/figure><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Swagger \u662f\u4e00\u4e2a\u89c4\u8303\u548c\u5b8c\u6574\u7684\u6846\u67b6\uff0c\u7528\u4e8e\u751f\u6210\u3001\u63cf\u8ff0\u3001\u8c03\u7528\u548c\u53ef\u89c6\u5316 RESTful \u98ce\u683c\u7684 Web \u670d\u52a1\u3002\u63d0 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[],"_links":{"self":[{"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts\/468"}],"collection":[{"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=468"}],"version-history":[{"count":3,"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts\/468\/revisions"}],"predecessor-version":[{"id":475,"href":"https:\/\/92it.top\/index.php?rest_route=\/wp\/v2\/posts\/468\/revisions\/475"}],"wp:attachment":[{"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=468"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=468"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/92it.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=468"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}