{"id":282095,"date":"2016-12-07T04:50:04","date_gmt":"2016-12-07T01:50:04","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=282095"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=282095","title":{"rendered":"\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b Vapor \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0432\u0435\u0431-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u043c\u0438"},"content":{"rendered":"<p>\u041f\u0440\u0430\u0432\u0434\u0430 \u043b\u0438, \u0447\u0442\u043e Vapor \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0442\u0430\u043a\u043e\u0439 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u0435\u0433\u043e \u0430\u0432\u0442\u043e\u0440\u044b? \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b Swift \u0432 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0441 Ruby, PHP, JS, Python, Java, C#, Go!<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/ce7\/cdd\/722\/ce7cdd722c974651a581a2433887e70c.jpg\"\/><\/p>\n<p>  <a name=\"habracut\"><\/a><br \/>  \u0412 \u0441\u0432\u043e\u0435\u0439 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 <a href=\"https:\/\/habrahabr.ru\/post\/316944\/\">\u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438<\/a> \u044f \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u043b \u0442\u0435\u043c\u0443 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0435\u0431-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u043a\u0430\u043a Vapor, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043e\u0431\u0435\u0449\u0430\u044e\u0442 \u0447\u0442\u043e \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0434\u043e 100 \u0440\u0430\u0437 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 \u0432 \u0432\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445, \u043d\u043e \u043e\u0434\u043d\u0438\u0445 \u043b\u0438\u0448\u044c \u0441\u043b\u043e\u0432 \u043c\u0430\u043b\u043e. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 \u043e\u0442 Qutheory ( \u0434\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 )<\/p>\n<p>  \u0423\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0438 \u0442\u0435\u0441\u0442\u0430:<\/p>\n<ul>\n<li>Vapor (Swift)<\/li>\n<li>Ruby on Rails (Ruby)<\/li>\n<li>Laravel (PHP)<\/li>\n<li>Lumen (PHP)<\/li>\n<li>Express (JavaScript)<\/li>\n<li>Django (Python)<\/li>\n<li>Flask (Python)<\/li>\n<li>Spring (Java)<\/li>\n<li>Nancy (C#)<\/li>\n<li>Go (\u0431\u0435\u0437 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432)<\/li>\n<\/ul>\n<p>  \u0422\u0435\u0441\u0442\u044b:<\/p>\n<ul>\n<li>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u0435\u043a\u0441\u0442<\/li>\n<li>JSON<\/li>\n<li>\u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 SQLite \u0437\u0430\u043f\u0440\u043e\u0441<\/li>\n<\/ul>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438\u0441\u044c \u0442\u0440\u0438\u0436\u0434\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u043d\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u044c\u043d\u043e\u043c Digital Ocean Droplet.<\/p>\n<pre><code class=\"bash\">wrk -d 10 -t 4 -c 128 http:\/\/&lt;host&gt;:&lt;port&gt;\/plaintext wrk -d 10 -t 4 -c 128 http:\/\/&lt;host&gt;:&lt;port&gt;\/json wrk -d 10 -t 4 -c 128 http:\/\/&lt;host&gt;:&lt;port&gt;\/sqlite-fetch <\/code><\/pre>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/b><\/p>\n<div class=\"spoiler_text\">Vapor \u0438 Express \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0439\u0448\u0438\u043c\u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u043a\u043e\u043d\u043a\u0443\u0440\u0441\u0430, \u043a\u043e\u043d\u043a\u0443\u0440\u0438\u0440\u0443\u044f \u0441 \u0447\u0438\u0441\u0442\u044b\u043c Go.  <\/div>\n<\/div>\n<p>  <b>\u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u0435\u043a\u0441\u0442<\/b><\/p>\n<p>  \u0422\u0435\u0441\u0442 \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u043c, \u0430 \u0435\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430. \u0423\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u043b\u0438\u0437\u043a\u043e Vapor \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u043a Go. \u0427\u0438\u0441\u0442\u044b\u0439 Swift HTTP \u0441\u0435\u0440\u0432\u0435\u0440 \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 \u043f\u043e\u0442\u043e\u043a\u0430\u0445, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a Go \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0441\u043e\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u043d\u043e \u043e\u043d\u0438 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438. \u0412\u043f\u043e\u043b\u043d\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0447\u0442\u043e Vapor \u043f\u0440\u0438\u043c\u0435\u0442 \u044d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u043c\u0430 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, Swift \u043d\u0430 Linux \u0435\u0449\u0435 \u0432 \u0431\u0435\u0442\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 toolchains. \u0421 \u043d\u043e\u0432\u044b\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c Swift \u0438\u043c\u0435\u0435\u0442 \u0432\u0441\u0435 \u0448\u0430\u043d\u0441\u044b \u0441\u0432\u0435\u0440\u0433\u043d\u0443\u0442\u044c Go.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/343\/260\/c78\/343260c78cba8f73a9384e66bb21b95c.png\" alt=\"image\"\/><\/p>\n<p>  <b> JSON <\/b><\/p>\n<p>  \u0411\u0443\u0434\u0443\u0447\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u043d\u0430 JavaScript, Express \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0432 \u044d\u0442\u043e\u043c \u0442\u0435\u0441\u0442\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e (JSON \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 JavaScript Object Notation, \u0435\u0441\u043b\u0438 \u043a\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u043b). Vapor \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u043e\u0447\u0435\u0442\u043d\u043e\u0435 \u0442\u0440\u0435\u0442\u044c\u0435 \u043c\u0435\u0441\u0442\u043e \u0438\u0437-\u0437\u0430 \u043d\u0435\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 JSON \u043d\u0430 Linux, \u043d\u043e \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0432 \u0442\u0440\u0438 \u0440\u0430\u0437\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/b53\/af5\/e13\/b53af5e13dd539441e801ba36c10315f.png\" alt=\"image\"\/><\/p>\n<p>  <b>SQLite \u0437\u0430\u043f\u0440\u043e\u0441<\/b><\/p>\n<p>  \u0421 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u043c \u043e\u0442\u0440\u044b\u0432\u043e\u043c Express \u0432\u044b\u0440\u0432\u0430\u043b\u0441\u044f \u0432\u043f\u0435\u0440\u0435\u0434, \u0430 Go \u043d\u0430 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0442\u0435\u0441\u0442\u0435. \u0415\u0449\u0435 \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e Vapor \u0441\u0442\u0430\u043b \u0432\u0442\u043e\u0440\u044b\u043c, \u0431\u0443\u0434\u0443\u0447\u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u043c, \u043a\u0440\u043e\u043c\u0435 Spring, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u043c ORM.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/75e\/ff5\/837\/75eff5837fd05f71b6b7fcc0c9152f1f.png\" alt=\"image\"\/><\/p>\n<p>  <b>\u041a\u043e\u0434 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f<\/b><\/p>\n<p>  \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u043e\u0434 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432<\/p>\n<p>  <b>Vapor<\/b><\/p>\n<p>  Vapor \u0431\u044b\u043b \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0441 \u043d\u0430 POSIX-thread HTTP, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Swift\u2019s 06\u201306 toolchain \u0441 \u0440\u0435\u043b\u0438\u0437\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439<\/p>\n<pre><code class=\"bash\">vapor run --release --port=8000 <\/code><\/pre>\n<p>  Vapor CLI \u0441\u0434\u0435\u043b\u0430\u043b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 \u044d\u0442\u043e\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u043c, \u044d\u0442\u043e \u0432\u0435\u0441\u044c \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0430.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">main.swift<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>import Vapor import Fluent import FluentSQLite  let app = Application()  do {     let driver = try SQLiteDriver(path: &quot;\/home\/helper\/database\/test.sqlite&quot;)     Database.default = Database(driver: driver) } catch {     print(&quot;Could not open SQLite database: \\(error)&quot;) }  app.get(&quot;plaintext&quot;) { request in     return &quot;Hello, world!&quot; }  app.get(&quot;json&quot;) { request in     return JSON([         &quot;array&quot;: [1, 2, 3],         &quot;dict&quot;: [&quot;one&quot;: 1, &quot;two&quot;: 2, &quot;three&quot;: 3],         &quot;int&quot;: 42,         &quot;string&quot;: &quot;test&quot;,         &quot;double&quot;: 3.14,         &quot;null&quot;: nil     ]) }  app.get(&quot;sqlite-fetch&quot;) { request in     guard let user = try User.random() else {         throw Abort.notFound     }      return user }  app.globalMiddleware = []  app.start() <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Fluent, \u0430 Swift \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u0430\u0448\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u0437\u0430\u0449\u0438\u0442\u0443 \u043e\u0442 \u0441\u0431\u043e\u0435\u0432, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u0442\u0430\u043c, \u0433\u0434\u0435 \u043c\u044b \u0434\u0443\u043c\u0430\u0435\u043c.<\/p>\n<p>  <b>Ruby<\/b><\/p>\n<p>  \u00ab\u0420\u0435\u043b\u044c\u0441\u044b\u00bb \u0431\u044b\u043b\u0438 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u0438\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0430 \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u0432\u0438\u0434\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432.<\/p>\n<pre><code class=\"bash\">bin\/rails s \u2014 binding=107.170.131.198 -p 8600 -e production<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">benchmark_controller.rb<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"ruby\">class BenchmarkController &lt; ActionController::Base    def plaintext       render plain: &quot;Hello world&quot;    end     def json       a = [1, 2, 3]       d = {&quot;one&quot; =&gt; 1, &quot;two&quot; =&gt; 2, &quot;three&quot; =&gt; 3}        r = {&quot;array&quot; =&gt; a, &quot;dict&quot; =&gt; d, &quot;int&quot; =&gt; 42, &quot;string&quot; =&gt; &quot;test&quot;, &quot;double&quot; =&gt; 3.14, &quot;null&quot; =&gt; nil}               render :json =&gt; r    end     def sqlite        r = ActiveRecord::Base.connection.exec_query(&quot;SELECT * FROM users ORDER BY random() LIMIT 1&quot;)        render :json =&gt; r    end end <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">database.yml<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"ruby\">production:   &lt;&lt;: *default   database: \/home\/helper\/database\/test.sqlite <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">routes.rb<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"ruby\">Rails.application.routes.draw do   get 'plaintext' =&gt; 'benchmark#plaintext'   get 'json' =&gt; 'benchmark#json'   get 'sqlite-fetch' =&gt; 'benchmark#sqlite' end <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <b>Nancy<\/b><\/p>\n<p>  Nancy \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f open-source \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0434\u043b\u044f .NET, \u0432 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430\u0445 \u0443 \u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043b\u0435\u0433\u043a\u0438\u0439 \u0432\u0435\u0441 \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u043e\u0441\u0442\u044c. \u0418\u043c\u0435\u044f \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c 250 \u0441\u043e\u0430\u0432\u0442\u043e\u0440\u043e\u0432 \u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e, Nancy \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e C# \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0445\u043e\u0440\u043e\u0448 \u0432 \u0432\u0435\u0431\u0435.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">HomeModule.cs<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cs\">using System; using System.IO; using System.Linq; using System.Reflection; using Dapper; using Microsoft.Data.Sqlite; using Nancy;  namespace NancyVsVapor {     public class HomeModule : NancyModule     {         private static string connstring = string.Concat(&quot;Data Source=&quot;, Path.Combine(             Path.GetDirectoryName(typeof(HomeModule).GetTypeInfo().Assembly.Location),             &quot;test.sqlite&quot;));          private static Random random = new Random();          public HomeModule()         {             Get(&quot;\/plaintext&quot;, _ =&gt; &quot;Hello, World!&quot;);              Get(&quot;\/json&quot;, _ =&gt;             {                 return Response.AsJson(new JsonModel());             });              Get(&quot;sqlite-fetch&quot;, async (_, __) =&gt;             {                 using (var conn = new SqliteConnection(connstring))                 {                     var users = await conn.QueryAsync&lt;User&gt;(&quot;select * from users where id = @id&quot;, new { id = random.Next(1, 3) });                     return Response.AsJson(users.FirstOrDefault());                 }             });         }     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <b>Laravel<\/b><\/p>\n<p>  Laravel \u0431\u044b\u043b \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Nginx \u0438 PHP 5.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">laravel.conf<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"php\">server {     listen 8701;      root \/home\/helper\/laravel-tanner\/benchmark\/public;     index index.php index.html index.htm;      server_name 107.170.131.198;      location \/ {         try_files $uri $uri\/ \/index.php?$query_string;     }      location ~ \\.php$ {         try_files $uri \/index.php =404;         fastcgi_split_path_info ^(.+\\.php)(\/.+)$;         fastcgi_pass unix:\/var\/run\/php5-fpm.sock;         fastcgi_index index.php;         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;         include fastcgi_params;     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">routes.php<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"php\">&lt;?php use DB; Route::get('\/plaintext', function() {     return 'Hello, world!'; }); Route::get('\/json', function() {     return [         'array' =&gt; [1, 2, 3],         'dict' =&gt; [             'one' =&gt; 1,             'two' =&gt; 2,             'three' =&gt; 3         ],         'int' =&gt; 42,         'string' =&gt; 'test',         'double' =&gt; 3.14,         'null' =&gt; null     ]; }); Route::get('\/sqlite-fetch', function() {     return DB::select('SELECT * FROM users ORDER BY random() LIMIT 1'); }); <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <b>Lumen<\/b><\/p>\n<p>  Lumen \u0431\u044b\u043b \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e Laravel.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">routes.php<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"php\">&lt;?php $app-&gt;get('\/plaintext', function() {     return 'Hello, world!'; }); $app-&gt;get('\/json', function() {     return [         'array' =&gt; [1, 2, 3],         'dict' =&gt; [             'one' =&gt; 1,             'two' =&gt; 2,             'three' =&gt; 3         ],         'int' =&gt; 42,         'string' =&gt; 'test',         'double' =&gt; 3.14,         'null' =&gt; null     ]; }); $app-&gt;get('\/sqlite-fetch', function() {     return \\DB::select('SELECT * FROM users ORDER BY random() LIMIT 1'); }); <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <b>Express<\/b><\/p>\n<p>  Express \u0431\u044b\u043b \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f NPM \u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440.<\/p>\n<pre><code class=\"bash\">npm run cluster<\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">cluster.js<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">var cluster = require('cluster');  if(cluster.isMaster) { \tvar cpuCount = require('os').cpus().length;      for(var i = 0; i &lt; cpuCount; i += 1) { \t\tcluster.fork(); \t}  \tcluster.on('exit', function(worker) { \t\tconsole.log('Worker %d died, replacing', worker.id); \t\tcluster.fork(); \t}); } else { \tvar app = require('.\/app.js');  \tapp.app.listen(app.port, function() { \t\tconsole.log('Benchmarking worker %d listening on %d', cluster.worker.id, app.port) \t}); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">app.js<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">const express = require('express'); const app = express();  const sqlite3 = require('sqlite3'); const db = new sqlite3.Database('..\/database\/test.sqlite');  app.get('\/plaintext', function(req, res) {         res.setHeader('Content-Type', 'text\/plain');         res.send('Hello, World!'); });  app.get('\/json', function(req, res) {         res.send({                 array: [1, 2, 3],                 dict: {                         one: 1,                         two: 2,                         'three': 3                 },                 int: 42,                 string: 'test',                 double: 3.14,                 'null': null         }); });  app.get('\/sqlite-fetch', function(req, res) {         db.get('select * from users where id = ?', Math.floor(Math.random() * 3) + 1, function(err, row) {                 if(err) {                         res.send(err.message);                 } else {                         res.send(row);                 }         }); });  module.exports = {         app: app,         port: 8400 } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  Express \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u0430\u043a\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0443 \u043d\u0435\u0433\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 C, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u0438\u0448\u0435\u0442\u0435 \u043d\u0430 JavaScript \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f C \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<\/p>\n<p>  <b>Django<\/b><\/p>\n<p>  Django \u0431\u044b\u043b \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f wsgi \u0438 gunicorn.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">urls.py<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">from django.conf.urls import url from django.http import HttpResponse from django.http import JsonResponse from django.db import connection  def plaintext(request):     return HttpResponse('Hello, world')  def json(request):     return JsonResponse({         &quot;array&quot;: [1, 2, 3],         &quot;dict&quot;: {&quot;one&quot;: 1, &quot;two&quot;: 2, &quot;three&quot;: 3},         &quot;int&quot;: 42,         &quot;string&quot;: &quot;test&quot;,         &quot;double&quot;: 3.14,         &quot;null&quot;: None     })  def sqlite(request):     cursor = connection.cursor()     cursor.execute(&quot;SELECT * FROM users ORDER BY random() LIMIT 1&quot;)     row = cursor.fetchone()      return JsonResponse(row, safe=False)  urlpatterns = [     url(r'^plaintext', plaintext),     url(r'^json', json),     url(r'^sqlite-fetch', sqlite) ] <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <b>Flask<\/b><\/p>\n<p>  \u041a Flask \u0442\u043e\u0442 \u0436\u0435 \u043f\u043e\u0434\u0445\u043e\u0434.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">run.py<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">import sys import flask import random import sqlite3 import logging import socket  logging.basicConfig(level=logging.WARNING, format='%(levelname)s: %(message)s')  app = flask.Flask(__name__)  application = app  db = sqlite3.connect('.\/test.sqlite') conn = db.cursor() conn.row_factory = sqlite3.Row  @app.route(&quot;\/plaintext&quot;) def plaintext():     return &quot;Hello, world!&quot;  @app.route(&quot;\/json&quot;) def json():     return flask.jsonify(**{         &quot;array&quot;: [1, 2, 3],         &quot;dict&quot;: {&quot;one&quot;: 1, &quot;two&quot;: 2, &quot;three&quot;: 3},         &quot;int&quot;: 42,         &quot;string&quot;: &quot;test&quot;,         &quot;double&quot;: 3.14,         &quot;null&quot;: None     })  @app.route(&quot;\/sqlite-fetch&quot;) def sqlite_fetch():     id = random.randint(1, 3)     r = conn.execute(&quot;select * from users where id = ?&quot;, (id,)).fetchone()     if r is not None:         d = dict(zip(r.keys(), r))         return flask.jsonify(d)     else:         flask.abort(404)   if __name__ == &quot;__main__&quot;:     port = 8137     print 'Listening on port %s' % port     while True:         try:             app.run(port=port, host=&quot;107.170.131.198&quot;)             sys.exit(0)         except socket.error as e:             logging.warn(&quot;socket error: %s&quot; % e) <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <b>Go<\/b><\/p>\n<p>  Go \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440, \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440, \u0430 \u0432\u0441\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u043c\u0435\u0441\u0442\u0438\u043b\u043e\u0441\u044c \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">bench.go<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"go\">package main  import (         &quot;encoding\/json&quot;         &quot;flag&quot;         &quot;fmt&quot;         &quot;io&quot;         &quot;log&quot;         &quot;net\/http&quot;          &quot;github.com\/jmoiron\/sqlx&quot;         _ &quot;github.com\/mattn\/go-sqlite3&quot; )  func Plaintext(w http.ResponseWriter, req *http.Request) {         io.WriteString(w, &quot;Hello World!\\n&quot;) }  type JSONStruct struct {         Array  []int          `json:&quot;array&quot;`         Dict   map[string]int `json:&quot;dict&quot;`         Int    int            `json:&quot;int&quot;`         String string         `json:&quot;string&quot;`         Double float64        `json:&quot;double&quot;`         Null   interface{}    `json:&quot;null&quot;` }  func JSON(w http.ResponseWriter, req *http.Request) {         j := JSONStruct{Array: []int{1, 2, 3},                 Dict:   map[string]int{&quot;one&quot;: 1, &quot;two&quot;: 2, &quot;three&quot;: 3},                 Int:    42,                 String: &quot;test&quot;,                 Double: 3.14,                 Null:   nil}          b, _ := json.MarshalIndent(j, &quot;&quot;, &quot; &quot;)         io.WriteString(w, string(b)) }  type User struct {         ID    int    `db:&quot;id&quot; json:&quot;id,omitempty&quot;`         Name  string `db:&quot;name&quot; json:&quot;name,omitempty&quot;`         Email string `db:&quot;email&quot; json:&quot;email,omitempty&quot;` }  \/\/ typical usage would keep or cache the open DB connection var db, _ = sqlx.Open(&quot;sqlite3&quot;, &quot;..\/database\/test.sqlite&quot;)  func SQLiteFetch(w http.ResponseWriter, req *http.Request) {         user := User{}         rows, err := db.Queryx(&quot;select * from users order by random() limit 1&quot;)         if err != nil {                 log.Fatal(err)         }         defer rows.Close()          for rows.Next() {                 err = rows.StructScan(&user)                 if err != nil {                         log.Fatal(err)                 }                  b, _ := json.MarshalIndent(user, &quot;&quot;, &quot; &quot;)                 io.WriteString(w, string(b))         } }  var portNumber int  func main() {         flag.IntVar(&portNumber, &quot;port&quot;, 8300, &quot;port number to listen on&quot;)         flag.Parse()          http.HandleFunc(&quot;\/plaintext&quot;, Plaintext)         http.HandleFunc(&quot;\/json&quot;, JSON)         http.HandleFunc(&quot;\/sqlite-fetch&quot;, SQLiteFetch)          log.Println(&quot;bench running on&quot;, fmt.Sprintf(&quot;%d&quot;, portNumber))          err := http.ListenAndServe(fmt.Sprintf(&quot;:%d&quot;, portNumber), nil)         if err != nil {                 log.Fatal(err)         } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <b>Spring<\/b><\/p>\n<p>  Java \u0431\u044b\u043b\u0430 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Spring Boot \u043d\u0430 JVM.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">ApplicationController.java<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">package com.hlprmnky.vapor_spring_benchmark;  import java.util.Arrays; import java.util.List; import java.util.Random; import java.util.concurrent.atomic.AtomicLong;  import com.google.common.collect.ImmutableMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController;  @RestController public class ApplicationController {      private final AtomicLong counter = new AtomicLong();     private final Random random = new Random();      @Autowired     private UserRepository userRepository;      @RequestMapping(&quot;\/json&quot;)     public Json json() {         return new Json(counter.incrementAndGet(), Arrays.asList(1, 2, 3),                 ImmutableMap.of(&quot;one&quot;, 1, &quot;two&quot;, 2, &quot;three&quot;, 3),                 &quot;test&quot;, 42, 3.14);     }      @RequestMapping(&quot;\/plaintext&quot;)     public String plaintext() {         return &quot;Hello, World!&quot;;     }      @RequestMapping(&quot;\/sqlite-fetch&quot;)     public User sqliteFetch() {         List&lt;User&gt; allUsers = userRepository.findAll();         return allUsers.get(random.nextInt(allUsers.size()));     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043f\u043e <a href=\"https:\/\/medium.com\/@qutheory\/server-side-swift-vs-the-other-guys-2-speed-ca65b2f79505#.k2k80el1c\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a>.<br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/317006\/\"> https:\/\/habrahabr.ru\/post\/317006\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u0440\u0430\u0432\u0434\u0430 \u043b\u0438, \u0447\u0442\u043e Vapor \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0442\u0430\u043a\u043e\u0439 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u0435\u0433\u043e \u0430\u0432\u0442\u043e\u0440\u044b? \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b Swift \u0432 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0438 \u0441 Ruby, PHP, JS, Python, Java, C#, Go!<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/ce7\/cdd\/722\/ce7cdd722c974651a581a2433887e70c.jpg\"\/><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-282095","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/282095","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=282095"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/282095\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=282095"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=282095"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=282095"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}