{"id":271166,"date":"2021-06-10T17:00:52","date_gmt":"2021-06-10T14:00:52","guid":{"rendered":"https:\/\/en.buradabiliyorum.com\/what-is-reflection-in-programming-cloudsavvy-it\/"},"modified":"2021-06-10T17:00:52","modified_gmt":"2021-06-10T14:00:52","slug":"what-is-reflection-in-programming-cloudsavvy-it","status":"publish","type":"post","link":"https:\/\/buradabiliyorum.com\/en\/what-is-reflection-in-programming-cloudsavvy-it\/","title":{"rendered":"#What is \u201cReflection\u201d in Programming? \u2013 CloudSavvy IT"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-6a3be7bdca311\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #dd3333;color:#dd3333\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #dd3333;color:#dd3333\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6a3be7bdca311\" checked aria-label=\"Toggle\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/buradabiliyorum.com\/en\/what-is-reflection-in-programming-cloudsavvy-it\/#An_Example_of_Reflection\" >An Example of Reflection<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/buradabiliyorum.com\/en\/what-is-reflection-in-programming-cloudsavvy-it\/#Using_Reflection_With_Unpredictable_Values\" >Using Reflection With Unpredictable Values<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/buradabiliyorum.com\/en\/what-is-reflection-in-programming-cloudsavvy-it\/#Reflection_Compilation_and_Assembles\" >Reflection, Compilation, and Assembles<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/buradabiliyorum.com\/en\/what-is-reflection-in-programming-cloudsavvy-it\/#Eval_Statements\" >Eval Statements<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/buradabiliyorum.com\/en\/what-is-reflection-in-programming-cloudsavvy-it\/#Conclusion\" >Conclusion<\/a><\/li><\/ul><\/nav><\/div>\n<p><strong>&#8220;#What is \u201cReflection\u201d in Programming? \u2013 CloudSavvy IT&#8221;<\/strong><\/p>\n<div id=\"article-content-area\">\n<figure style=\"width: 1998px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"type:primaryImage wp-image-11888 size-full\" data-pagespeed-lazy-src=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/05\/a477938d.png?width=1198&amp;trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"programming illustration\" width=\"1998\" height=\"1078\" src=\"https:\/\/www.shutterstock.com\/image-illustration\/programming-code-abstract-technology-background-software-746652751\" data-credittext=\"Shutterstock\/whiteMocca\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><figcaption class=\"wp-caption-text\"><span class=\"type:primaryImage imagecredit\"><a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/www.shutterstock.com\/image-illustration\/programming-code-abstract-technology-background-software-746652751\">Shutterstock\/whiteMocca<\/a><\/span><\/figcaption><\/figure>\n<p>Reflective programming is a mechanism that lets a process introspective capabilities. The reflection APIs built into programming languages allow you to inspect code at runtime. You can use this ability to learn about the surrounding codebase and its contents.<\/p>\n<p>Reflection\u2019s often talked about in the context of object-oriented programming. You often use reflection to discover codebase entities at runtime. The language\u2019s reflection API will let you inspect classes, methods, properties, and types from within your system. This lets you build more dynamic functionality.<\/p>\n<p>Systems which utilize reflection are able to interrogate and modify their own environments. This is where reflection differs from plain value introspection. A language with full reflection support will permit codebase modification at runtime, effectively allowing the source to rewrite aspects of itself.<\/p>\n<h2 id=\"an-example-of-reflection\"><span class=\"ez-toc-section\" id=\"An_Example_of_Reflection\"><\/span>An Example of Reflection<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>One common use for reflection is during testing. Reflection can help you mock classes by exposing their internal behaviors. A class method that\u2019s <code>protected<\/code> or <code>private<\/code> wouldn\u2019t usually be testable; using reflection, you can override the visibility constraint so it becomes <code>public<\/code> in your unit tests.<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"php\">\n<pre class=\"de1\"><span class=\"kw2\">class<\/span> Test <span class=\"br0\">{<\/span>\n\u00a0\n    <span class=\"kw2\">protected<\/span> int <span class=\"re0\">$Value<\/span><span class=\"sy0\">;<\/span>\n\u00a0\n    <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> __construct<span class=\"br0\">(<\/span>int <span class=\"re0\">$Value<\/span><span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span>\n        <span class=\"re0\">$this<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">Value<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$Value<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"br0\">}<\/span>\n\u00a0\n    <span class=\"kw2\">protected<\/span> <span class=\"kw2\">function<\/span> computeValue<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span> <span class=\"sy0\">:<\/span> int <span class=\"br0\">{<\/span>\n        <span class=\"kw1\">return<\/span> <span class=\"br0\">(<\/span><span class=\"re0\">$this<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">Value<\/span> <span class=\"sy0\">*<\/span> <span class=\"nu0\">2<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"br0\">}<\/span>\n\u00a0\n<span class=\"br0\">}<\/span>\n\u00a0\n<span class=\"co4\">\/**\n * Without Reflection\n *\/<\/span>\n\u00a0\n<span class=\"re0\">$t<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">new<\/span> Test<span class=\"br0\">(<\/span><span class=\"nu0\">10<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n\u00a0\n<span class=\"co1\">\/\/ Error - the method isn't publicly accessible<\/span>\n<span class=\"kw3\">assert<\/span><span class=\"br0\">(<\/span><span class=\"re0\">$t<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">computeValue<\/span><span class=\"br0\">(<\/span><span class=\"br0\">)<\/span> <span class=\"sy0\">===<\/span> <span class=\"nu0\">20<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n\u00a0\n<span class=\"co4\">\/**\n * Using Reflection\n *\/<\/span>\n\u00a0\n<span class=\"re0\">$reflectionMethod<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">new<\/span> ReflectionMethod<span class=\"br0\">(<\/span>Test<span class=\"sy0\">::<\/span><span class=\"kw2\">CLASS<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">\"computeValue\"<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n<span class=\"re0\">$reflectionMethod<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">setAccessible<\/span><span class=\"br0\">(<\/span><span class=\"kw4\">true<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n\u00a0\n<span class=\"re0\">$t<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw2\">new<\/span> Test<span class=\"br0\">(<\/span><span class=\"nu0\">10<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n\u00a0\n<span class=\"co1\">\/\/ This now works!<\/span>\n<span class=\"kw3\">assert<\/span><span class=\"br0\">(<\/span><span class=\"re0\">$reflectionMethod<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">invoke<\/span><span class=\"br0\">(<\/span><span class=\"re0\">$t<\/span><span class=\"br0\">)<\/span> <span class=\"sy0\">===<\/span> <span class=\"nu0\">20<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>In this example using PHP, the <code>Test<\/code> class defines a <code>protected<\/code> method that\u2019s used internally. As the method\u2019s performing a calculation, you might want to unit test it. You can\u2019t call the method externally but PHP\u2019s Reflection API lets you bypass the visibility constraints. A <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/www.php.net\/manual\/en\/class.reflectionmethod.php\"><code>ReflectionMethod<\/code><\/a> instance provides information about the method and lets you invoke a modified version.<\/p>\n<p>While this is helpful, you should be conscious that it can be misused. Widespread use of reflection in testing is often indicative of bigger problems in your codebase. It implies the class\u2019 interface is overly restrictive and unsuited to its responsibilities. In many cases, it\u2019s more <a href=\"https:\/\/buradabiliyorum.com\/en\/category\/download-scripts-themes-apps\/\" data-internallinksmanager029f6b8e52c=\"9\" title=\"Download Scripts &amp; Themes &amp; Apps\" target=\"_blank\" rel=\"noopener\">app<\/a>ropriate to refactor the protected method out into a new class that exposes its own public interface.<\/p>\n<p>Here\u2019s how that might look for the example shown above:<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"php\">\n<pre class=\"de1\"><span class=\"kw2\">class<\/span> Calculator <span class=\"br0\">{<\/span>\n\u00a0\n    <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> computeValue<span class=\"br0\">(<\/span><span class=\"br0\">)<\/span> <span class=\"sy0\">:<\/span> int <span class=\"br0\">{<\/span>\n        <span class=\"kw1\">return<\/span> <span class=\"br0\">(<\/span><span class=\"re0\">$this<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">Value<\/span> <span class=\"sy0\">*<\/span> <span class=\"nu0\">2<\/span><span class=\"br0\">)<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"br0\">}<\/span>\n\u00a0\n<span class=\"br0\">}<\/span>\n\u00a0\n<span class=\"kw2\">class<\/span> Test <span class=\"br0\">{<\/span>\n\u00a0\n    <span class=\"kw2\">protected<\/span> int <span class=\"re0\">$Value<\/span><span class=\"sy0\">;<\/span>\n\u00a0\n    <span class=\"kw2\">protected<\/span> Calculator <span class=\"re0\">$Calculator<\/span><span class=\"sy0\">;<\/span>\n\u00a0\n    <span class=\"kw2\">public<\/span> <span class=\"kw2\">function<\/span> __construct<span class=\"br0\">(<\/span>int <span class=\"re0\">$Value<\/span><span class=\"sy0\">,<\/span> Calculator <span class=\"re0\">$Calculator<\/span><span class=\"br0\">)<\/span> <span class=\"br0\">{<\/span>\n        <span class=\"re0\">$this<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">Value<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$Value<\/span><span class=\"sy0\">;<\/span>\n        <span class=\"re0\">$this<\/span> <span class=\"sy0\">-&gt;<\/span> <span class=\"me1\">Calculator<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$Calculator<\/span><span class=\"sy0\">;<\/span>\n    <span class=\"br0\">}<\/span>\n\u00a0\n<span class=\"br0\">}<\/span><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>The calculator component is now its own standalone unit with a testable public interface. This goes hand-in-hand with dependency injection \u2013 the <code>Test<\/code> class is now given a <code>Calculator<\/code> which implements the calculation logic.<\/p>\n<h2 id=\"using-reflection-with-unpredictable-values\"><span class=\"ez-toc-section\" id=\"Using_Reflection_With_Unpredictable_Values\"><\/span>Using Reflection With Unpredictable Values<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Reflection\u2019s also useful when you\u2019re writing generic code within a framework. You might need to interface with user-supplied types which you can\u2019t anticipate. Reflection can help when you don\u2019t know what methods and properties a type exposes.<\/p>\n<p>You can obtain a picture of the type\u2019s functionality without any previous knowledge of its source. This is useful in the context of logging and error reporting components which might want to dump the member list of any class they\u2019re passed.<\/p>\n<p>Data marshalling systems are often implemented in this way too. Imagine a marshaller that takes a class and converts it to a JSON representation. You might define a convention that any method that\u2019s prefixed with <code>get<\/code> and ends with <code>Json<\/code> (e.g.\u00a0<code>getUserJson()<\/code>) should be called by the marshaller and added to its output. Reflection provides the mechanism to get the list of methods. You\u2019d then implement logic to identify the ones you should call.<\/p>\n<h2 id=\"reflection-compilation-and-assembles\"><span class=\"ez-toc-section\" id=\"Reflection_Compilation_and_Assembles\"><\/span>Reflection, Compilation, and Assembles<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Reflection provides additional capabilities in compiled languages that utilize linked libraries and assemblies. Reflection APIs let you inspect the contents of loaded assemblies. In languages <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/standard\/assembly\">such as C#<\/a>, you can dynamically load additional assemblies by utilizing Reflection APIs.<\/p>\n<p>This approach can be useful if you\u2019re implementing a plugin system with user-supplied assemblies. Your program won\u2019t know which plugins are available when it\u2019s compiled. Each time it launches, it\u2019ll need to check the filesystem to find available plugin assemblies. Once a plugin\u2019s been found, Reflection provides a mechanism to load and instantiate its members.<\/p>\n<p>You could inspect the plugin, find the classes it provides and register it with your application. Further inspection of the assembly might provide the plugin\u2019s name and version for display in your logs and user interface.<\/p>\n<p>Reflection can also be used to switch out assemblies based on external configuration. Let\u2019s say you\u2019re writing an application that saves image files to storage. You might have a <code>LocalStorageDriver<\/code>, <code>FtpStorageDriver<\/code> and <code>AmazonS3StorageDriver<\/code>, each contained in its own assembly (<a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/docs.microsoft.com\/en-us\/troubleshoot\/windows-client\/deployment\/dynamic-link-library\">a <code>.dll<\/code><\/a> in C#).<\/p>\n<p>Using reflection, you could offer a \u201cstorage driver\u201d key in your system\u2019s configuration file. The appropriate assembly would be loaded dynamically based on your config file\u2019s value. You\u2019d inspect the assembly to discover the class that implements your <code>StorageDriver<\/code> interface.<\/p>\n<p>This approach lets you switch out components of your system at runtime. You don\u2019t need to recompile or restart your program to change between assemblies. This gives you increased flexibility and assists the implementation of configuration directives.<\/p>\n<h2 id=\"eval-statements\"><span class=\"ez-toc-section\" id=\"Eval_Statements\"><\/span>Eval Statements<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Reflection is closely related to <code>eval<\/code>. Many programming languages provide a way to execute dynamic string values as source code.<\/p>\n<p>Eval is a permutation of reflection with almost limitless power. It lets you create and run new code within a live program. This poses a potentially catastrophic security issue if user input gets fed into the <code>eval<\/code> string.<\/p>\n<p>An eval statement should be used when you\u2019re left with no other options. You need to make sure the statement is executed in a restricted context which can\u2019t be exploited by users. Remember that a successful code injection would give an attacker the same powers as your regular application code.<\/p>\n<h2 id=\"conclusion\"><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Reflection is a programming technique that gives code introspective abilities. Effective use of reflection lets you write more dynamic systems and benefit from increased automation. You can also use reflection to unit test otherwise unreachable private code.<\/p>\n<p>You do need to exercise caution. Reflection APIs in programming languages are powerful so with them comes responsibility. The biggest issue is reflection\u2019s ability to subvert the protections provided by your programming language.<\/p>\n<p>Reflection permits the existence of scenarios that would otherwise be impossible, such as writes to \u201cimmutable\u201d variables and widespread public use of private methods. You should be able to trust your code to respect the rules of its language. Use of the reflection APIs must therefore be carefully considered and scoped to specific sections of your system.\n<\/p><\/div>\n<blockquote><p><strong><span style=\"color: #ff6600;\">If you liked the article, do not forget to share it with your friends. Follow us on\u00a0<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/news.google.com\/publications\/CAAqBwgKMLG0nwswvr63Aw\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Google News<\/a><\/span>\u00a0too, click on the star and choose us from your favorites.<\/span><\/strong><\/p><\/blockquote>\n<blockquote>\n<p style=\"text-align: center;\">For forums sites go to <span style=\"color: #ff9900;\"><a style=\"color: #ff9900;\" href=\"https:\/\/forum.buradabiliyorum.com\/\" target=\"_blank\" rel=\"noopener\">Forum.BuradaBiliyorum.Com<\/a><\/span><\/strong><\/p>\n<\/blockquote>\n<blockquote>\n<p style=\"text-align: center;\"><strong>If you want to read more like this article, you can visit our <span style=\"color: #ff9900;\"><a style=\"color: #ff9900;\" href=\"https:\/\/en.buradabiliyorum.com\/technology\/\" target=\"_blank\" rel=\"noopener\">Technology category.<\/a><\/span><\/strong><\/p>\n<\/blockquote>\n<p><span style=\"color: black;\"><a style=\"color: #ff9900;\" href=\"https:\/\/www.cloudsavvyit.com\/11477\/what-is-reflection-in-programming\/\" target=\"_blank\" rel=\"noopener\">Source<\/a><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8220;#What is \u201cReflection\u201d in Programming? \u2013 CloudSavvy IT&#8221; Shutterstock\/whiteMocca Reflective programming is a mechanism that lets a process introspective capabilities. The reflection APIs built into programming languages allow you to inspect code at runtime. You can use this ability to learn about the surrounding codebase and its contents. Reflection\u2019s often talked about in the context&#8230;<\/p>\n","protected":false},"author":1,"featured_media":271167,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/05\/a477938d.png","fifu_image_alt":"","footnotes":""},"categories":[18],"tags":[],"class_list":["post-271166","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technology"],"_links":{"self":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts\/271166","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/comments?post=271166"}],"version-history":[{"count":0,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts\/271166\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/media\/271167"}],"wp:attachment":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/media?parent=271166"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/categories?post=271166"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/tags?post=271166"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}