

{"id":21425,"date":"2018-07-31T04:05:30","date_gmt":"2018-07-31T04:05:30","guid":{"rendered":"https:\/\/data-flair.training\/blogs\/?p=21425"},"modified":"2021-05-19T18:23:57","modified_gmt":"2021-05-19T12:53:57","slug":"zookeeper-api-java-api","status":"publish","type":"post","link":"https:\/\/data-flair.training\/blogs\/zookeeper-api-java-api\/","title":{"rendered":"Zookeeper API &#8211; Java Binding &amp; C Binding"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">Today, we will see Apache ZooKeeper API. Moreover, in this ZooKeeper API tutorial, we will learn<strong> ZooKeeper<\/strong> Java API and C API. Also, we will discuss ZooKeper Java API example. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">There is an official API binding for Java and C, in Zookeeper. However, for most of the languages (.NET, <strong>Python<\/strong>, etc.) ZooKeeper community provides unofficial API.\u00a0<\/span><\/p>\n<p>So, let&#8217;s start the ZooKeeper API tutorial.<\/p>\n<h2><span style=\"font-weight: 400;\">What is Zookeeper API?<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">There is an official API binding for <strong>Java<\/strong> and C, in Zookeeper. However, for most of the languages (.NET, Python, etc.) ZooKeeper community provides unofficial API. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Basically, an application can connect, interact, manipulate data, coordinate, and finally disconnect from a ZooKeeper ensemble, by using ZooKeeper API.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">In addition,\u00a0we can use all the functionality of the ZooKeeper ensemble in a simple and safe manner, because of the rich set of <strong>features of ZooKeeper<\/strong> API. Moreover, these APIs offers both synchronous as well as asynchronous methods.<\/span><\/p>\n<p><strong>Do you know about ZooKeeper CLI<\/strong><\/p>\n<p><span style=\"font-weight: 400;\">So, we ZooKeeper API and ZooKeeper ensemble completely complement each other in every aspect. Also, it benefits the developers in a great way.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Bindings in ZooKeeper API<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">In two languages, Java and C, the ZooKeeper client libraries come. So, let\u2019s understand both in detail:<\/span><\/p>\n<h3>a. ZooKeeper Java API<\/h3>\n<p><span style=\"font-weight: 400;\">ZooKeeper Java binding is made up of two packages, such as org.apache.zookeeper and org.apache.zookeeper.data. Apart from that packages which make up ZooKeeper are used internally or are part of the server implementation. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Moreover, the generated classes which are used simply as containers do make the org.apache.zookeeper.data package.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">In addition, the ZooKeeper class is the main class ZooKeeper Java client uses. Only by an optional session id and password,<\/span><span style=\"font-weight: 400;\"> its two constructors differ<\/span><span style=\"font-weight: 400;\">. And, across instances of a process, ZooKeeper supports session recovery.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Though,<\/span><span style=\"font-weight: 400;\"> two threads are created, <\/span><span style=\"font-weight: 400;\">when a ZooKeeper object is created, they are an IO thread and an event thread. By using Java NIO, all IO happens on the IO thread. And on the event thread, all event callbacks happen. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Furthermore, Session maintenance also happens on IO thread. It includes reconnecting to ZooKeeper servers as well as maintaining the heartbeat. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Also, the responses for the synchronous methods process in the IO thread and for asynchronous methods and watch events on the event thread.<\/span><\/p>\n<p><strong><em>Things to remember in ZooKeeper Java Binding<\/em><\/strong><\/p>\n<p><span style=\"font-weight: 400;\">Now few points to notice that result from this design:<\/span><\/p>\n<p>1. For asynchronous calls and watcher callbacks, all completions will be made in order, but one at a time. However, there are no boundaries on the caller that it can perform any processing they wish, but they have to make sure that during that time no other callbacks will be processed.<\/p>\n<p>2. The processing of the IO thread or the processing of the synchronous calls is not blocked by Callbacks.<\/p>\n<p>3. And, the Synchronous calls may not get back in the correct sequence.<\/p>\n<p><span style=\"font-weight: 400;\">Ultimately, there are several rules associated with shutdown are straightforward, like the ZooKeeper object becomes invalid, as soon as a ZooKeeper object is closed or receives a fatal event (SESSION_EXPIRED and AUTH_FAILED).\u00a0<\/span><\/p>\n<h3>b. C Binding<\/h3>\n<p><span style=\"font-weight: 400;\">Basically, the C binding has a multi-threaded library and a single-threaded library. On defining a multi-threaded library, it is the easiest one to use and also it is very same as Java API. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">However, for handling connection maintenance and callbacks, this library will create an IO thread and an event dispatch thread. Whereas, we use the single-threaded library in event-driven applications especially by exposing the event loop which is used in the multithreaded library.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">There are two shared libraries in this package; zookeeper_st and zookeeper_mt. Although, for integrating into the application&#8217;s event loop, the former only offers the asynchronous APIs as well as callbacks. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">Basically, it supports the platforms were a pthread library is not available or is unstable (i.e. FreeBSD 4.x). However, \u00a0application developers should link with zookeeper_mt, in all other cases, because it involves support for both Sync as well as Async API.<\/span><\/p>\n<h4><span style=\"font-weight: 400;\">i. Installation of ZooKeeper C Binding<\/span><\/h4>\n<p><span style=\"font-weight: 400;\">We need to follow the below steps if we are building the client from a check-out from the Apache repository. Although, we need to skip to step 3 if we are building from a project source package which we download from apache.<\/span><\/p>\n<p>1. At very first, Run ant compile_jute from the ZooKeeper top-level directory (&#8230;\/trunk). So, it will create a directory of the name &#8220;generated&#8221; under &#8230;\/trunk\/src\/c.<\/p>\n<p>2. After that, change directory to the&#8230;\/trunk\/src\/c and run autoreconf -if to bootstrap autoconf, automake, and libtool. Also, make sure we have autoconf version 2.59 or greater installed. Skip to step 4.<\/p>\n<p>3. Further, unzip\/untar the source tarball and cd to the zookeeper-x.x.x\/src\/c directory, \u00a0if we are building from a project source package.<\/p>\n<p>4. Now, to generate the makefile, run .\/configure &lt;our-options&gt;. Here are some of the options the configure utility supports that can be useful in this step:<\/p>\n<ul>\n<li style=\"font-weight: 400;\"><strong>&#8211;enable-debug<\/strong><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">This option enables optimization, as well as enables, debug info compiler options. (Disabled by default.)<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><strong>&#8211;without-syncapi<\/strong><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">However, this option disables Sync API support; zookeeper_mt library won&#8217;t built. (Enabled by default.)<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><strong>&#8211;disable-static<\/strong><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">It does not build static libraries. (Enabled by default.)<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><strong>&#8211;disable-shared<\/strong><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">And, this one does not build shared libraries. (Enabled by default.)<\/span><\/p>\n<p>5. Also, to build the libraries and install them, run make or make install.<\/p>\n<p>6. Furthermore, run make doxygen-doc, to generate doxygen documentation for the ZooKeeper API. However, in a new subfolder of name docs, all documentation are available. However, this command only generates HTML, by default.<\/p>\n<h4><span style=\"font-weight: 400;\">ii. Using the C Client<\/span><\/h4>\n<p><span style=\"font-weight: 400;\">By running a ZooKeeper server and connecting to it using one of the client applications, we can test our client that was built as part of the installation procedure. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">We could also use cli_st (singlethreaded, built against zookeeper_st library), but here we are using cli_mt (multithreaded, built against zookeeper_mt library) in this example:<\/span><br \/>\n<b><\/b><\/p>\n<p><b>$ cli_mt zookeeper_host:9876<\/b><\/p>\n<p><span style=\"font-weight: 400;\">Now, for executing simple ZooKeeper commands, this is a client application which gives us a shell. Hence, \u00a0it displays a shell prompt, once successfully started and connected to the server. In this way, we can enter ZooKeeper commands. <\/span><\/p>\n<p><span style=\"font-weight: 400;\">For example, in order to create a node:<\/span><\/p>\n<pre class=\"EnlighterJSRAW\">&gt; create \/my_new_node<\/pre>\n<p><span style=\"font-family: Verdana, Geneva, sans-serif;\">Now, to verify that the node&#8217;s been created:<\/span><\/p>\n<pre class=\"EnlighterJSRAW\">&gt; ls \/<\/pre>\n<p><span style=\"font-weight: 400;\">Here, we must see a list of node those are children of the root node &#8220;\/&#8221;.<\/span><br \/>\n<span style=\"font-weight: 400;\">However, we have to remember few things in order to be able to use the ZooKeeper API in our application:<\/span><\/p>\n<p>1. Also, include ZooKeeper header: #include &lt;zookeeper\/zookeeper.h&gt;<\/p>\n<p>2. To enable the multi-threaded version of the library, compile with -DTHREADED compiler flag, if we are building a multithreaded client. Afterward, link against the zookeeper_mt library. However, do not compile with -DTHREADED, if we are building a single-threaded client, still ensure to link against the zookeeper_st library.<\/p>\n<p>So, this was all in ZooKeeper API tutorial. Hope you like our explanation<\/p>\n<h2><span style=\"font-weight: 400;\">Conclusion<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Hence, in this Apache ZooKeeper API tutorial, we have seen the whole concept of Zookeeper API (Java and C) in detail. Moreover, we discussed the ZooKeeper Java API example. Still, if you have any questions to ask regarding Zookeeper API, feel free to ask. Keep visiting Data Flair, keep learning!<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Today, we will see Apache ZooKeeper API. Moreover, in this ZooKeeper API tutorial, we will learn ZooKeeper Java API and C API. Also, we will discuss ZooKeper Java API example. There is an official&#46;&#46;&#46;<\/p>\n","protected":false},"author":7,"featured_media":21657,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[77],"tags":[994,1994,2261,2265,7374,7398,16042,16364,16374,16392,16393],"class_list":["post-21425","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-zookeeper","tag-api-in-zookeeper","tag-binding-in-zookeeper","tag-c-binding","tag-c-api","tag-java-api-in-zookeeper","tag-java-binding","tag-what-is-zookeeper-api","tag-zookeeper-api","tag-zookeeper-c-api","tag-zookeeper-java-api","tag-zookeeper-java-api-example"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Zookeeper API - Java Binding &amp; C Binding - DataFlair<\/title>\n<meta name=\"description\" content=\"Apache ZooKeeper API tutorial: ZooKeeper java APi, ZooKeeper C API, Binding in ZooKeeper, java binding, C Binding, ZooKeeper Java API Example\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/data-flair.training\/blogs\/zookeeper-api-java-api\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Zookeeper API - Java Binding &amp; C Binding - DataFlair\" \/>\n<meta property=\"og:description\" content=\"Apache ZooKeeper API tutorial: ZooKeeper java APi, ZooKeeper C API, Binding in ZooKeeper, java binding, C Binding, ZooKeeper Java API Example\" \/>\n<meta property=\"og:url\" content=\"https:\/\/data-flair.training\/blogs\/zookeeper-api-java-api\/\" \/>\n<meta property=\"og:site_name\" content=\"DataFlair\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/DataFlairWS\/\" \/>\n<meta property=\"article:published_time\" content=\"2018-07-31T04:05:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-05-19T12:53:57+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/data-flair.training\/blogs\/wp-content\/uploads\/sites\/2\/2018\/07\/Zookeeper-API-01.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"DataFlair Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@DataFlairWS\" \/>\n<meta name=\"twitter:site\" content=\"@DataFlairWS\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"DataFlair Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Zookeeper API - Java Binding &amp; C Binding - DataFlair","description":"Apache ZooKeeper API tutorial: ZooKeeper java APi, ZooKeeper C API, Binding in ZooKeeper, java binding, C Binding, ZooKeeper Java API Example","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/data-flair.training\/blogs\/zookeeper-api-java-api\/","og_locale":"en_US","og_type":"article","og_title":"Zookeeper API - Java Binding &amp; C Binding - DataFlair","og_description":"Apache ZooKeeper API tutorial: ZooKeeper java APi, ZooKeeper C API, Binding in ZooKeeper, java binding, C Binding, ZooKeeper Java API Example","og_url":"https:\/\/data-flair.training\/blogs\/zookeeper-api-java-api\/","og_site_name":"DataFlair","article_publisher":"https:\/\/www.facebook.com\/DataFlairWS\/","article_published_time":"2018-07-31T04:05:30+00:00","article_modified_time":"2021-05-19T12:53:57+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/data-flair.training\/blogs\/wp-content\/uploads\/sites\/2\/2018\/07\/Zookeeper-API-01.jpg","type":"image\/jpeg"}],"author":"DataFlair Team","twitter_card":"summary_large_image","twitter_creator":"@DataFlairWS","twitter_site":"@DataFlairWS","twitter_misc":{"Written by":"DataFlair Team","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/data-flair.training\/blogs\/zookeeper-api-java-api\/#article","isPartOf":{"@id":"https:\/\/data-flair.training\/blogs\/zookeeper-api-java-api\/"},"author":{"name":"DataFlair Team","@id":"https:\/\/data-flair.training\/blogs\/#\/schema\/person\/beb0cab24b7aa54423a3b50e669a9dcd"},"headline":"Zookeeper API &#8211; Java Binding &amp; C Binding","datePublished":"2018-07-31T04:05:30+00:00","dateModified":"2021-05-19T12:53:57+00:00","mainEntityOfPage":{"@id":"https:\/\/data-flair.training\/blogs\/zookeeper-api-java-api\/"},"wordCount":1210,"commentCount":0,"publisher":{"@id":"https:\/\/data-flair.training\/blogs\/#organization"},"image":{"@id":"https:\/\/data-flair.training\/blogs\/zookeeper-api-java-api\/#primaryimage"},"thumbnailUrl":"https:\/\/data-flair.training\/blogs\/wp-content\/uploads\/sites\/2\/2018\/07\/Zookeeper-API-01.jpg","keywords":["API in ZooKeeper","Binding in ZooKeeper","C Binding","C++ API","Java API in ZooKeeper","Java Binding","what is ZooKeeper API","ZooKeeper API","ZooKeeper C API","ZooKeeper Java API","ZooKeeper Java API example"],"articleSection":["Zookeeper Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/data-flair.training\/blogs\/zookeeper-api-java-api\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/data-flair.training\/blogs\/zookeeper-api-java-api\/","url":"https:\/\/data-flair.training\/blogs\/zookeeper-api-java-api\/","name":"Zookeeper API - Java Binding &amp; C Binding - DataFlair","isPartOf":{"@id":"https:\/\/data-flair.training\/blogs\/#website"},"primaryImageOfPage":{"@id":"https:\/\/data-flair.training\/blogs\/zookeeper-api-java-api\/#primaryimage"},"image":{"@id":"https:\/\/data-flair.training\/blogs\/zookeeper-api-java-api\/#primaryimage"},"thumbnailUrl":"https:\/\/data-flair.training\/blogs\/wp-content\/uploads\/sites\/2\/2018\/07\/Zookeeper-API-01.jpg","datePublished":"2018-07-31T04:05:30+00:00","dateModified":"2021-05-19T12:53:57+00:00","description":"Apache ZooKeeper API tutorial: ZooKeeper java APi, ZooKeeper C API, Binding in ZooKeeper, java binding, C Binding, ZooKeeper Java API Example","breadcrumb":{"@id":"https:\/\/data-flair.training\/blogs\/zookeeper-api-java-api\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/data-flair.training\/blogs\/zookeeper-api-java-api\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/data-flair.training\/blogs\/zookeeper-api-java-api\/#primaryimage","url":"https:\/\/data-flair.training\/blogs\/wp-content\/uploads\/sites\/2\/2018\/07\/Zookeeper-API-01.jpg","contentUrl":"https:\/\/data-flair.training\/blogs\/wp-content\/uploads\/sites\/2\/2018\/07\/Zookeeper-API-01.jpg","width":1200,"height":628,"caption":"Zookeeper API - Java Binding &amp; C Binding"},{"@type":"BreadcrumbList","@id":"https:\/\/data-flair.training\/blogs\/zookeeper-api-java-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Blog Home","item":"https:\/\/data-flair.training\/blogs\/"},{"@type":"ListItem","position":2,"name":"Zookeeper Tutorials","item":"https:\/\/data-flair.training\/blogs\/category\/zookeeper\/"},{"@type":"ListItem","position":3,"name":"Zookeeper API &#8211; Java Binding &amp; C Binding"}]},{"@type":"WebSite","@id":"https:\/\/data-flair.training\/blogs\/#website","url":"https:\/\/data-flair.training\/blogs\/","name":"DataFlair","description":"Learn Today. Lead Tomorrow.","publisher":{"@id":"https:\/\/data-flair.training\/blogs\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/data-flair.training\/blogs\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/data-flair.training\/blogs\/#organization","name":"DataFlair","url":"https:\/\/data-flair.training\/blogs\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/data-flair.training\/blogs\/#\/schema\/logo\/image\/","url":"https:\/\/data-flair.training\/blogs\/wp-content\/uploads\/sites\/2\/2016\/07\/Data-Flair.png","contentUrl":"https:\/\/data-flair.training\/blogs\/wp-content\/uploads\/sites\/2\/2016\/07\/Data-Flair.png","width":106,"height":48,"caption":"DataFlair"},"image":{"@id":"https:\/\/data-flair.training\/blogs\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/DataFlairWS\/","https:\/\/x.com\/DataFlairWS","https:\/\/www.linkedin.com\/company\/dataflair-web-services-pvt-ltd\/","https:\/\/www.youtube.com\/user\/DataFlairWS"]},{"@type":"Person","@id":"https:\/\/data-flair.training\/blogs\/#\/schema\/person\/beb0cab24b7aa54423a3b50e669a9dcd","name":"DataFlair Team","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/c322416204232f4dd97ef3901b0a499a5d34d7ba7fe333f4bfe53a907873d293?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c322416204232f4dd97ef3901b0a499a5d34d7ba7fe333f4bfe53a907873d293?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c322416204232f4dd97ef3901b0a499a5d34d7ba7fe333f4bfe53a907873d293?s=96&d=mm&r=g","caption":"DataFlair Team"},"description":"DataFlair Team specializes in creating clear, actionable content on programming, Java, Python, C++, DSA, AI, ML, data Science, Android, Flutter, MERN, Web Development, and technology. Backed by industry expertise, we make learning easy and career-oriented for beginners and pros alike.","url":"https:\/\/data-flair.training\/blogs\/author\/dfteam3\/"}]}},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/data-flair.training\/blogs\/wp-json\/wp\/v2\/posts\/21425","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/data-flair.training\/blogs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/data-flair.training\/blogs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/data-flair.training\/blogs\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/data-flair.training\/blogs\/wp-json\/wp\/v2\/comments?post=21425"}],"version-history":[{"count":8,"href":"https:\/\/data-flair.training\/blogs\/wp-json\/wp\/v2\/posts\/21425\/revisions"}],"predecessor-version":[{"id":94163,"href":"https:\/\/data-flair.training\/blogs\/wp-json\/wp\/v2\/posts\/21425\/revisions\/94163"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/data-flair.training\/blogs\/wp-json\/wp\/v2\/media\/21657"}],"wp:attachment":[{"href":"https:\/\/data-flair.training\/blogs\/wp-json\/wp\/v2\/media?parent=21425"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/data-flair.training\/blogs\/wp-json\/wp\/v2\/categories?post=21425"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/data-flair.training\/blogs\/wp-json\/wp\/v2\/tags?post=21425"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}