{"id":8410,"date":"2020-03-17T14:09:35","date_gmt":"2020-03-17T13:09:35","guid":{"rendered":"http:\/\/sviluppo.oimmei.com\/clienti\/oimmeidigitalboutique\/sito\/2020\/03\/17\/performe-task-after-http-with-symfony\/"},"modified":"2025-08-06T11:24:52","modified_gmt":"2025-08-06T09:24:52","slug":"performe-task-after-http-with-symfony","status":"publish","type":"post","link":"https:\/\/www.oimmei.com\/en\/performe-task-after-http-with-symfony\/","title":{"rendered":"Executing tasks after an HTTP call with Symfony"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"8410\" class=\"elementor elementor-8410 elementor-23765\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-75e38f5e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"75e38f5e\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-769d62ea\" data-id=\"769d62ea\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7dc92649 elementor-widget elementor-widget-text-editor\" data-id=\"7dc92649\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"font-weight: 400;\">Are you a web\/server developer? Do you work in PHP, maybe on <strong>Symfony<\/strong>? Do you find it difficult to develop one or more applications because there are some requests that have to perform very heavy operations and end up having very long response times? Are you in a crisis because <strong>you don&#8217;t know how to finish the four projects you&#8217;re stuck on by next Friday?<\/strong><\/span><\/p><p><span style=\"font-weight: 400;\">Unfortunately, I can&#8217;t help you with that last problem (and not even with the second one, to be honest), but when it comes to the third problem I might have a suggestion.<\/span><\/p><p><span style=\"font-weight: 400;\">Particularly <strong>in API development, it&#8217;s not unusual to find yourself fin a situation where a certain call has to trigger the execution of a longer and heavier task, but at the same time you can&#8217;t afford to make the clients wait too long waiting for a reply<\/strong>. Often, though, this task can also be performed during the call. Let&#8217;s think of an <strong>API for sending push notifications<\/strong>: the client sends a notification to be delivered and the address of the devices to send it to, but you don&#8217;t have to wait for it to be sent to every recipient before replying to it. You can also say that about the <strong>scheduling or sending emails<\/strong>, or even for the elaboration of heavy data that doesn&#8217;t need client interaction.<\/span><\/p><p><span style=\"font-weight: 400;\">If you have found yourself facing similar problems, you may have solved them using the classic task scheduling: save the details of the operation to be performed, end the call and then a scheduled command takes care of the dirty work instead of the API. <strong>But what if I told you that, with Symfony, there is a better way that doesn&#8217;t require creating a configuration separate from your application?<\/strong><\/span><\/p><p><span style=\"font-weight: 400;\">You probably already heard about the<\/span><a href=\"https:\/\/symfony.com\/doc\/4.4\/reference\/events.html\"><span style=\"font-weight: 400;\"> Symfony events<\/span><\/a><span style=\"font-weight: 400;\"> and how to use them. I will not dwell on this too much, but they&#8217;re events launched by the framework during the elaboration of an HTTP request (and not only that), useful to control and modify their flow. One in particular can provide a simple and elegant solution to our problem: the <\/span><a href=\"https:\/\/symfony.com\/doc\/4.4\/components\/http_kernel.html#the-kernel-terminate-event\"><b>kernel.terminate<\/b><\/a><span style=\"font-weight: 400;\">. This event is launched after sending the reply to the caller. <strong>But how can it help us with the slowness of our API<\/strong> to make our clients happy?<\/span><\/p><p><strong>Let&#8217;s see an example.<\/strong><\/p><p><span style=\"font-weight: 400;\">Our test application will be delivered in <\/span><b>Symfony 4.4<\/b><span style=\"font-weight: 400;\">, the current LTS version. On other versions of Symfony, from the 3rd onwards, on which I recommend you to read about, the functionality is still very similar.<\/span><\/p><p><span style=\"font-weight: 400;\">We then have an API with an endpoint <\/span><i><span style=\"font-weight: 400;\">\/perform-heavy-task<\/span><\/i><span style=\"font-weight: 400;\"> that takes care of some heavy operation, with logs to keep an eye on it.<\/span><\/p><div dir=\"ltr\" align=\"left\"><table style=\"height: 461px;\" width=\"481\"><tbody><tr><td><pre>namespace AppController;\n\nuse PsrLogLoggerInterface;\nuse SymfonyBundleFrameworkBundleControllerAbstractController;\nuse SymfonyComponentRoutingAnnotationRoute;\n\nclass HeavyTaskController extends AbstractController\n{\n\u00a0\u00a0\u00a0\u00a0\/**\n\u00a0\u00a0\u00a0\u00a0\u00a0* @Route(\"\/perform-heavy-task\", name=\"perform_heavy_task\", defaults={\"_format\": \"json\"})\n\u00a0\u00a0\u00a0\u00a0\u00a0*\/\n\u00a0\u00a0\u00a0\u00a0public function performHeavyTask(LoggerInterface $logger)\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0   $logger-&gt;info(\"Starting heavy task...\");\n\u00a0\u00a0\u00a0\u00a0 \/\/ Complesso task assolutamente cruciale per la buona riuscita del nostro progetto.\n\u00a0\u00a0\u00a0\u00a0 sleep(10);\n\n\u00a0\u00a0\u00a0\u00a0 $logger-&gt;info(\"Sending response...\");\n\n\u00a0\u00a0\u00a0\u00a0 return $this-&gt;json(['message' =&gt; '*puff puff* Heavy task completed!']);\n\u00a0\u00a0\u00a0\u00a0}\n}<\/pre><\/td><\/tr><\/tbody><\/table><\/div><p dir=\"ltr\">As we can see in the log, in this simple asset the application does exactly what we imagined: the call reaches the controller, the entire task completion time passes and the response is sent to the client. So, not the best.<\/p><div dir=\"ltr\" align=\"left\"><table><colgroup> <col \/><\/colgroup><tbody><tr><td><pre dir=\"ltr\">[2020-03-09 19:27:20] request.INFO: Matched route \"perform_heavy_task\"...\n[2020-03-09 19:27:20] app.INFO: Starting heavy task... [] []\n[2020-03-09 19:27:30] app.INFO: Sending response... [] []<\/pre><\/td><\/tr><\/tbody><\/table><\/div><p dir=\"ltr\">But, if our task can be postponed, our kernel.terminate comes to our rescue.<\/p><p dir=\"ltr\">We create an <a href=\"https:\/\/symfony.com\/doc\/4.4\/event_dispatcher.html#creating-an-event-listener\">event listener<\/a>\u00a0(or a <a href=\"https:\/\/symfony.com\/doc\/4.4\/event_dispatcher.html#creating-an-event-subscriber\">subscriber<\/a>, if we prefer) ready to accept a TerminateEvent object, aka our event, and move our important task there. We will need a RouterInterface to be sure that the task will actually start after the performHeavyTask: kernel.terminate will be launched after all the requests!<\/p><div dir=\"ltr\" align=\"left\"><table><colgroup> <col \/><\/colgroup><tbody><tr><td><pre>namespace AppEventListener;\n\nuse PsrLogLoggerInterface;\nuse SymfonyComponentHttpKernelEventTerminateEvent;\nuse SymfonyComponentRoutingRouterInterface;\n\nclass HeavyTaskListener\n{\n     \/**\n      * @var RouterInterface\n      *\/\n     private $router;\n     \/**\n      * @var LoggerInterface\n      *\/\n     private $logger;\n\n     public function __construct(RouterInterface $router, LoggerInterface $logger)\n    {\n            $this-&gt;router = $router;\n            $this-&gt;logger = $logger;\n    }\n\n\n    public function onKernelTerminate(TerminateEvent $event)\n   {\n           \/\/ Ci facciamo dire qual \u00e8 la route dell'attuale richiesta.\n           $currentRoute = \n$this-&gt;router-&gt;match($event-&gt;getRequest()-&gt;getPathInfo());\n           if ('perform_heavy_task' === $currentRoute['_route']) {\n                 \/\/ Siamo nella route interessata: via con il task.\n                 $this-&gt;logger-&gt;info(\"Starting heavy task...\");\n\n                \/\/ Complesso task assolutamente cruciale per la buona riuscita del nostro progetto.\n                sleep(10);\n\n                $this-&gt;logger-&gt;info(\"*puff puff* Heavy task completed!\");\n           }\n     }\n}<\/pre><\/td><\/tr><\/tbody><\/table><\/div><p dir=\"ltr\">Let&#8217;s configure the listener in services.yaml\u2026<\/p><div dir=\"ltr\" align=\"left\"><table><colgroup> <col \/><\/colgroup><tbody><tr><td><pre dir=\"ltr\">\u00a0 \u00a0 <span style=\"font-weight: 400;\">AppEventListenerHeavyTaskListener<\/span>:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0arguments:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0- '@router'\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0- '@logger'\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0tags:\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0- { name: kernel.event_listener, event: kernel.terminate }<\/pre><\/td><\/tr><\/tbody><\/table><\/div><p dir=\"ltr\">&#8230;with the previous action which we will modify like this.<\/p><div dir=\"ltr\" align=\"left\"><table><colgroup> <col \/><\/colgroup><tbody><tr><td><pre dir=\"ltr\">\u00a0 \u00a0 public function performHeavyTask(LoggerInterface $logger)\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0 $logger-&gt;info(\"Sending response...\");\n\n\u00a0\u00a0\u00a0\u00a0 return $this-&gt;json(['message' =&gt; 'About to perform the heavy task!']);\n\u00a0\u00a0\u00a0\u00a0}<\/pre><\/td><\/tr><\/tbody><\/table><\/div><p dir=\"ltr\">We try it and instantly see the difference: this time the response is sent immediately, and only after that the task is launched and completed.<\/p><div dir=\"ltr\" align=\"left\"><table><colgroup> <col \/><\/colgroup><tbody><tr><td><pre dir=\"ltr\">[2020-03-09 19:50:44] request.INFO: Matched route \"perform_heavy_task\"...\n[2020-03-09 19:50:44] app.INFO: Sending response... [] []\n[2020-03-09 19:50:44] app.INFO: Starting heavy task... [] []\n[2020-03-09 19:50:54] app.INFO: *puff puff* Heavy task completed! [] []<\/pre><\/td><\/tr><\/tbody><\/table><\/div><p dir=\"ltr\"><strong>Much better!<\/strong><\/p><p dir=\"ltr\">In closing, a few notes on this event.<\/p><ul><li dir=\"ltr\"><p dir=\"ltr\" role=\"presentation\">As I have said, the events of the HttpKernel component, like the kernel.terminate, are launched during the elaboration of all the requests received by the application, which is why you need to implement a system to \u201crecognize\u201d the request in the listener. In the example we have used route recognition, but it&#8217;s of course not the only possible technique: another possibility is to use a service, injected in both the controller and the listener, which will track the status of the request. This is also an excellent way to share data between the controller and the listener.<\/p><\/li><li dir=\"ltr\"><p dir=\"ltr\" role=\"presentation\"><span style=\"font-weight: 400;\">Since the response is sent before the listener starts, the client has no information about a possible failure of the task performed in the listener itself. If it is important to notify the caller about errors, we will have to deliver them in another way, for example with an email.<\/span><\/p><\/li><li dir=\"ltr\"><p dir=\"ltr\" role=\"presentation\">At the moment of writing, only PHP-FPM servers can continue elaborating requests after sending the response: if our server can&#8217;t use this technology, the listener will run, but the response will reach the client only after the elaboration, rendering the event useless.<\/p><\/li><\/ul><p dir=\"ltr\">Beyond these clarifications, we have seen how with <strong>kernel.terminate we can speed up client-side calls without having to rely on other services or technologies.<\/strong><\/p><p>So, let&#8217;s make our clients happy! Let&#8217;s entrust our heavy tasks to the listeners! And let&#8217;s not forget the motto that every self-respecting developer should have: if some work can be postponed, postpone it.<\/p><p>Andrea Cioni<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Are you a web\/server developer? Do you work in PHP, maybe on Symfony? Do you find it difficult to develop one or more applications because there are some requests that have to perform very heavy operations and end up having very long response times? Are you in a crisis because you don&#8217;t know how to [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":8076,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[91],"tags":[],"class_list":["post-8410","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software-development-en"],"acf":[],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Boost Symfony API speed using kernel.terminate: send responses instantly and run heavy tasks in the background for a smoother client experience.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Oimmei Team\"\/>\n\t<meta name=\"google-site-verification\" content=\"nrov3ZDmFh2g122GMXaTWPiPrzv3uAspJFs_42s7-6s\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.oimmei.com\/en\/performe-task-after-http-with-symfony\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Oimmei Technologies | The Boutique Agency\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Executing tasks after an HTTP call with Symfony | Oimmei Technologies\" \/>\n\t\t<meta property=\"og:description\" content=\"Boost Symfony API speed using kernel.terminate: send responses instantly and run heavy tasks in the background for a smoother client experience.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.oimmei.com\/en\/performe-task-after-http-with-symfony\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/www.oimmei.com\/wp-content\/uploads\/2026\/08\/oimmei-cover-website-26-scaled.png\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/www.oimmei.com\/wp-content\/uploads\/2026\/08\/oimmei-cover-website-26-scaled.png\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-03-17T13:09:35+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2025-08-06T09:24:52+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Executing tasks after an HTTP call with Symfony | Oimmei Technologies\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Boost Symfony API speed using kernel.terminate: send responses instantly and run heavy tasks in the background for a smoother client experience.\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/www.oimmei.com\/wp-content\/uploads\/2026\/08\/oimmei-cover-website-26-x.png\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Executing tasks after an HTTP call with Symfony | Oimmei Technologies","description":"Boost Symfony API speed using kernel.terminate: send responses instantly and run heavy tasks in the background for a smoother client experience.","canonical_url":"https:\/\/www.oimmei.com\/en\/performe-task-after-http-with-symfony\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"google-site-verification":"nrov3ZDmFh2g122GMXaTWPiPrzv3uAspJFs_42s7-6s","miscellaneous":""},"schema":null,"og:locale":"en_US","og:site_name":"Oimmei Technologies | The Boutique Agency","og:type":"article","og:title":"Executing tasks after an HTTP call with Symfony | Oimmei Technologies","og:description":"Boost Symfony API speed using kernel.terminate: send responses instantly and run heavy tasks in the background for a smoother client experience.","og:url":"https:\/\/www.oimmei.com\/en\/performe-task-after-http-with-symfony\/","og:image":"https:\/\/www.oimmei.com\/wp-content\/uploads\/2026\/08\/oimmei-cover-website-26-scaled.png","og:image:secure_url":"https:\/\/www.oimmei.com\/wp-content\/uploads\/2026\/08\/oimmei-cover-website-26-scaled.png","article:published_time":"2020-03-17T13:09:35+00:00","article:modified_time":"2025-08-06T09:24:52+00:00","twitter:card":"summary","twitter:title":"Executing tasks after an HTTP call with Symfony | Oimmei Technologies","twitter:description":"Boost Symfony API speed using kernel.terminate: send responses instantly and run heavy tasks in the background for a smoother client experience.","twitter:image":"https:\/\/www.oimmei.com\/wp-content\/uploads\/2026\/08\/oimmei-cover-website-26-x.png"},"aioseo_meta_data":{"post_id":"8410","title":null,"description":"Boost Symfony API speed using kernel.terminate: send responses instantly and run heavy tasks in the background for a smoother client experience.","keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"BlogPosting","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":{"faqs":[],"keyPoints":[],"titles":[],"descriptions":[],"socialPosts":{"email":[],"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2025-03-15 22:11:11","updated":"2025-08-06 09:25:25","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.oimmei.com\/en\/\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">|<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.oimmei.com\/en\/category\/software-development-en\/\" title=\"Software Development\">Software Development<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">|<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tExecuting tasks after an HTTP call with Symfony\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.oimmei.com\/en\/"},{"label":"Software Development","link":"https:\/\/www.oimmei.com\/en\/category\/software-development-en\/"},{"label":"Executing tasks after an HTTP call with Symfony","link":"https:\/\/www.oimmei.com\/en\/performe-task-after-http-with-symfony\/"}],"_links":{"self":[{"href":"https:\/\/www.oimmei.com\/en\/wp-json\/wp\/v2\/posts\/8410","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.oimmei.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.oimmei.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.oimmei.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.oimmei.com\/en\/wp-json\/wp\/v2\/comments?post=8410"}],"version-history":[{"count":0,"href":"https:\/\/www.oimmei.com\/en\/wp-json\/wp\/v2\/posts\/8410\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.oimmei.com\/en\/wp-json\/wp\/v2\/media\/8076"}],"wp:attachment":[{"href":"https:\/\/www.oimmei.com\/en\/wp-json\/wp\/v2\/media?parent=8410"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.oimmei.com\/en\/wp-json\/wp\/v2\/categories?post=8410"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.oimmei.com\/en\/wp-json\/wp\/v2\/tags?post=8410"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}