{"id":837,"date":"2026-07-02T06:02:16","date_gmt":"2026-07-01T23:02:16","guid":{"rendered":"https:\/\/sumberlaba.com\/index.php\/2026\/07\/02\/mastering-graphql-with-react-the-ultimate-guide-to-efficient-data-fetching\/"},"modified":"2026-07-02T06:02:16","modified_gmt":"2026-07-01T23:02:16","slug":"mastering-graphql-with-react-the-ultimate-guide-to-efficient-data-fetching","status":"publish","type":"post","link":"https:\/\/sumberlaba.com\/index.php\/2026\/07\/02\/mastering-graphql-with-react-the-ultimate-guide-to-efficient-data-fetching\/","title":{"rendered":"Mastering GraphQL with React: The Ultimate Guide to Efficient Data Fetching"},"content":{"rendered":"<h1>Mastering GraphQL with React: The Ultimate Guide to Efficient Data Fetching<\/h1>\n<p>Modern single\u2011page applications demand efficient and flexible data fetching. While REST APIs have been the standard for years, they often force developers to either over\u2011fetch or under\u2011fetch data\u2014wasting bandwidth and complicating state management. GraphQL, a query language for APIs, solves these problems by letting clients request exactly the data they need in a single round trip. When combined with React, GraphQL offers a declarative, component\u2011driven approach to data management that aligns perfectly with React\u2019s philosophy. This comprehensive guide will take you from the absolute basics of GraphQL to building a production\u2011ready React application using Apollo Client. You\u2019ll learn how to set up queries, mutations, caching, pagination, and best practices that will help you avoid common pitfalls. Whether you\u2019re migrating from REST or starting a greenfield project, this tutorial will equip you with the knowledge to harness the full power of GraphQL inside your React components.<\/p>\n<p>The synergy between React and GraphQL is not accidental. Both technologies embrace a declarative mindset: React describes the UI as a function of state, while GraphQL describes the data requirements of each component. This natural alignment eliminates the need for manual data\u2011fetching orchestration. With Apollo Client, the most popular GraphQL client for React, you can write queries directly inside your components, let the client handle caching and lifecycle updates, and automatically re\u2011render when data changes. Moreover, Apollo\u2019s normalized cache ensures that updates from one component instantly reflect in every other component that uses the same piece of data. In this guide, we will build a small but realistic application\u2014a list of blog posts with commenting functionality\u2014to illustrate every concept. By the end, you will have a solid understanding of how to integrate GraphQL seamlessly into your React workflow, reducing boilerplate and speeding up development.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/via.placeholder.com\/800x600\/4a90d9\/ffffff?text=how%20to%20use%20GraphQL%20with%20React\" alt=\"Article illustration\" style=\"display:block;margin:20px auto;max-width:100%;height:auto;border-radius:8px;\" \/><\/p>\n<h2>What You Will Need Before Starting<\/h2>\n<p>Before diving into the code, make sure you have a working environment. You will need Node.js (version 16 or higher) and npm or yarn installed on your machine. A basic understanding of React (hooks, components, props) is assumed. For the GraphQL server, we will use a public API (the SpaceX GraphQL or a simple Star Wars API) to avoid setting up a backend; however, the concepts apply equally to your own servers. We will use Apollo Client version 3.x because it is the most feature\u2011rich and well\u2011documented GraphQL client for React. Optionally, you can install Apollo Client DevTools for Chrome to inspect queries, cache, and mutations in real time. If you prefer a lighter alternative, you could explore urql or Relay, but Apollo offers the easiest learning curve for beginners.<\/p>\n<h2>Step 1: Setting Up the React Project and Installing Dependencies<\/h2>\n<p>Start by creating a new React application using Create React App or Vite. We\u2019ll use Vite for its speed. Open your terminal and run the following commands:<\/p>\n<pre><code>npm create vite@latest graphql-react-tutorial -- --template react\ncd graphql-react-tutorial\nnpm install\nnpm install @apollo\/client graphql\n<\/code><\/pre>\n<p>The <code>@apollo\/client<\/code> package includes everything you need to connect to a GraphQL server: ApolloClient, InMemoryCache, ApolloProvider, and React hooks. The <code>graphql<\/code> package is a peer dependency that provides the <code>gql<\/code> tag template literal used to write queries. With these installed, we can now configure the client. The client acts as the central hub that manages sending requests, caching responses, and normalizing data. In the next step, we\u2019ll set up the ApolloProvider to make the client available to every component in your React tree.<\/p>\n<h2>Step 2: Configuring Apollo Client and Creating the Provider<\/h2>\n<p>Create a new file called <code>apollo-client.js<\/code> in the <code>src<\/code> folder. Import <code>ApolloClient<\/code>, <code>InMemoryCache<\/code>, and <code>HttpLink<\/code> from <code>@apollo\/client<\/code>. Typically, you will set up an <code>HttpLink<\/code> with the GraphQL endpoint URI. For this tutorial, we\u2019ll use the public SpaceX GraphQL API: <code>https:\/\/api.spacex.land\/graphql\/<\/code> (note: this API is often available, but if it\u2019s down, try the Star Wars API at <code>https:\/\/swapi-graphql.netlify.app\/.netlify\/functions\/index<\/code>). Here\u2019s the code:<\/p>\n<pre><code>import { ApolloClient, InMemoryCache, HttpLink } from '@apollo\/client';\n\nconst httpLink = new HttpLink({\n  uri: 'https:\/\/api.spacex.land\/graphql\/'\n});\n\nconst client = new ApolloClient({\n  link: httpLink,\n  cache: new InMemoryCache()\n});\n\nexport default client;\n<\/code><\/pre>\n<p>Now, wrap your root component (usually <code>App<\/code> or <code>main<\/code>) with <code>ApolloProvider<\/code> and pass the client as a prop. This is done in <code>main.jsx<\/code>:<\/p>\n<pre><code>import React from 'react';\nimport ReactDOM from 'react-dom\/client';\nimport { ApolloProvider } from '@apollo\/client';\nimport App from '.\/App';\nimport client from '.\/apollo-client';\n\nReactDOM.createRoot(document.getElementById('root')).render(\n  <React.StrictMode>\n    <ApolloProvider client={client}>\n      <App \/>\n    <\/ApolloProvider>\n  <\/React.StrictMode>\n);\n<\/code><\/pre>\n<p>The <code>ApolloProvider<\/code> places the client into React\u2019s context, enabling any descendant component to use hooks like <code>useQuery<\/code>. The <code>InMemoryCache<\/code> we configured will store fetched data and normalize it by type and id, allowing automatic updates across components. With this setup, you are ready to write your first GraphQL query.<\/p>\n<h2>Step 3: Writing Your First GraphQL Query and Using the useQuery Hook<\/h2>\n<p>GraphQL queries are strings written in the GraphQL query language. You can test them directly in a tool like GraphiQL (often exposed by the server at the same endpoint). For our SpaceX API, a query to get the names and details of the last three launches looks like this:<\/p>\n<pre><code>const GET_LAUNCHES = gql`\n  query GetLaunches {\n    launchesPast(limit: 3) {\n      id\n      mission_name\n      launch_date_local\n      details\n      rocket {\n        rocket_name\n      }\n    }\n  }\n`;\n<\/code><\/pre>\n<p>Inside your React component (for example, <code>Launches.jsx<\/code>), import <code>useQuery<\/code> and the <code>gql<\/code> tag. Then call the hook:<\/p>\n<pre><code>import { useQuery, gql } from '@apollo\/client';\n\nconst GET_LAUNCHES = gql`\n  query GetLaunches {\n    launchesPast(limit: 3) {\n      id\n      mission_name\n      launch_date_local\n      details\n      rocket {\n        rocket_name\n      }\n    }\n  }\n`;\n\nfunction Launches() {\n  const { loading, error, data } = useQuery(GET_LAUNCHES);\n\n  if (loading) return &lt;p&gt;Loading...&lt;\/p&gt;;\n  if (error) return &lt;p&gt;Error: {error.message}&lt;\/p&gt;;\n\n  return (\n    &lt;ul&gt;\n      {data.launchesPast.map(launch =&gt; (\n        &lt;li key={launch.id}&gt;\n          &lt;h3&gt;{launch.mission_name}&lt;\/h3&gt;\n          &lt;p&gt;{launch.details}&lt;\/p&gt;\n          &lt;span&gt;Rocket: {launch.rocket.rocket_name}&lt;\/span&gt;\n        &lt;\/li&gt;\n      ))}\n    &lt;\/ul&gt;\n  );\n}\n<\/code><\/pre>\n<p>The <code>useQuery<\/code> hook returns an object with three key properties: <code>loading<\/code> (true while the request is in flight), <code>error<\/code> (populated if something went wrong), and <code>data<\/code> (the actual response once received). This declarative pattern eliminates the need for manual <code>useEffect<\/code> calls and state management for fetching. Apollo also handles caching automatically: if the same query is executed again with identical variables, the data will be served from the in\u2011memory cache unless you specify a different fetch policy.<\/p>\n<h2>Step 4: Working with Variables and Dynamic Queries<\/h2>\n<p>In real applications, queries often depend on user input or component props. GraphQL supports variables that you pass to the query. Let\u2019s enhance our example to fetch a single launch by its ID. First, define the query with a variable placeholder:<\/p>\n<pre><code>const GET_LAUNCH = gql`\n  query GetLaunch($id: ID!) {\n    launch(id: $id) {\n      id\n      mission_name\n      details\n      rocket {\n        rocket_name\n      }\n    }\n  }\n`;\n<\/code><\/pre>\n<p>Now, in your component, you can pass the variable as the second argument to <code>useQuery<\/code> inside the <code>variables<\/code> property:<\/p>\n<pre><code>function LaunchDetail({ launchId }) {\n  const { loading, error, data } = useQuery(GET_LAUNCH, {\n    variables: { id: launchId }\n  });\n  \/\/ ... same rendering logic\n}\n<\/code><\/pre>\n<p>Apollo will automatically bind the variable to the query parameter. You can also pass other options like <code>fetchPolicy<\/code> (e.g., <code>'network-only'<\/code> to bypass cache) or <code>pollInterval<\/code> (to automatically refetch at a given interval). Variables make your queries reusable and safe against injection. Always use variables instead of string interpolation, as the latter can lead to GraphQL injection vulnerabilities.<\/p>\n<h2>Step 5: Performing Mutations with the useMutation Hook<\/h2>\n<p>Mutations are GraphQL\u2019s equivalent of POST, PUT, DELETE operations\u2014they modify data on the server. Let\u2019s add a simple mutation to \u201clike\u201d a launch (if the API supports it; for demonstration, we will assume a custom server, but the syntax is identical). In a real scenario, you would define a mutation like this:<\/p>\n<pre><code>const LIKE_LAUNCH = gql`\n  mutation LikeLaunch($launchId: ID!) {\n    likeLaunch(launchId: $launchId) {\n      id\n      likes\n    }\n  }\n`;\n<\/code><\/pre>\n<p>Use the <code>useMutation<\/code> hook to obtain a mutate function:<\/p>\n<pre><code>import { useMutation } from '@apollo\/client';\n\nfunction LikeButton({ launchId }) {\n  const [likeLaunch, { loading, error }] = useMutation(LIKE_LAUNCH, {\n    variables: { launchId },\n    refetchQueries: [GET_LAUNCHES]  \/\/ optionally refetch a related query\n  });\n\n  if (loading) return &lt;button disabled&gt;Liking...&lt;\/button&gt;;\n\n  return &lt;button onClick={likeLaunch}&gt;Like&lt;\/button&gt;;\n}\n<\/code><\/pre>\n<p>The <code>useMutation<\/code> hook returns a tuple where the first element is the mutate function (call it to execute the mutation), and the second element is an object with <code>loading<\/code>, <code>error<\/code>, <code>data<\/code>, and other fields. You can trigger the mutation in response to a user action, such as a button click. For more advanced use cases, Apollo can automatically update the cache after a mutation using the <code>update<\/code> callback or <code>refetchQueries<\/code>.<\/p>\n<h2>Step 6: Optimistic Updates and Cache Interactions<\/h2>\n<p>One of Apollo\u2019s most powerful features is optimistic updates\u2014updating the UI immediately after a mutation, even before the server responds, to give the user a snappy experience. To implement optimistic updates, you provide an <code>optimisticResponse<\/code> option inside the mutation call. When the mutation resolves, Apollo replaces the optimistic data with the real server response. For example, if you are adding a comment, you can simulate the new comment:<\/p>\n<pre><code>const [addComment] = useMutation(ADD_COMMENT, {\n  optimisticResponse: {\n    __typename: 'Mutation',\n    addComment: {\n      __typename: 'Comment',\n      id: -1,              \/\/ temporary id\n      text: commentText,\n      createdAt: new Date().toISOString()\n    }\n  },\n  update: (cache, { data }) => {\n    \/\/ Manually update the cache to include the new comment\n    const existingComments = cache.readQuery({ query: GET_COMMENTS });\n    cache.writeQuery({\n      query: GET_COMMENTS,\n      data: {\n        comments: [...existingComments.comments, data.addComment]\n      }\n    });\n  }\n});\n<\/code><\/pre>\n<p>This technique requires a good understanding of the cache structure. Use the Apollo DevTools to inspect the cache shape. Always match the <code>__typename<\/code> and fields exactly. Optimistic updates dramatically improve perceived performance and are a hallmark of professional GraphQL applications.<\/p>\n<h2>Step 7: Pagination and the fetchMore Function<\/h2>\n<p>When dealing with long lists, you need pagination. GraphQL supports cursor\u2011based and offset\u2011based pagination. Apollo\u2019s <code>useQuery<\/code> returns a <code>fetchMore<\/code> function that you can call to load the next page. Below is an example using offset pagination (limit and offset):<\/p>\n<pre><code>const GET_LAUNCHES = gql`\n  query GetLaunches($limit: Int!, $offset: Int!) {\n    launchesPast(limit: $limit, offset: $offset) {\n      id\n      mission_name\n    }\n  }\n`;\n\nfunction LaunchesList() {\n  const { data, loading, fetchMore } = useQuery(GET_LAUNCHES, {\n    variables: { limit: 10, offset: 0 }\n  });\n\n  if (loading) return &lt;p&gt;Loading...&lt;\/p&gt;;\n\n  const loadMore = () => {\n    fetchMore({\n      variables: {\n        offset: data.launchesPast.length\n      },\n      updateQuery: (prev, { fetchMoreResult }) => {\n        if (!fetchMoreResult) return prev;\n        return {\n          launchesPast: [...prev.launchesPast, ...fetchMoreResult.launchesPast]\n        };\n      }\n    });\n  };\n\n  return (\n    &lt;div&gt;\n      {\/* render list *\/}\n      &lt;button onClick={loadMore}&gt;Load More&lt;\/button&gt;\n    &lt;\/div&gt;\n  );\n}\n<\/code><\/pre>\n<p>The <code>updateQuery<\/code> callback tells Apollo how to merge the new results with the existing cache. For infinite scroll or \u201cLoad More\u201d buttons, this pattern is reliable and well\u2011supported. Apollo also supports field policies for more advanced cache merging.<\/p>\n<h2>Table 1: Comparison of Popular GraphQL Clients for React<\/h2>\n<table border=\"1\" cellpadding=\"8\" cellspacing=\"0\">\n<thead>\n<tr>\n<th>Feature<\/th>\n<th>Apollo Client (v3)<\/th>\n<th>urql<\/th>\n<th>Relay<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Bundle Size (gzipped)<\/td>\n<td>~35 KB<\/td>\n<td>~10 KB<\/td>\n<td>~50 KB (but includes compiler)<\/td>\n<\/tr>\n<tr>\n<td>Learning Curve<\/td>\n<td>Easy to moderate<\/td>\n<td>Easy<\/td>\n<td>Steep (requires build\u2011time optimization)<\/td>\n<\/tr>\n<tr>\n<td>Cache Normalization<\/td>\n<td>Automatic, configurable<\/td>\n<td>Configurable (Document Cache or Normalized)<\/td>\n<td>Automatic, opinionated<\/td>\n<\/tr>\n<tr>\n<td>React Hooks API<\/td>\n<td>Rich (useQuery, useMutation, useSubscription, etc.)<\/td>\n<td>Simple (useQuery, useMutation)<\/td>\n<td>Provides Relay Hooks (useQuery, useMutation, useFragment)<\/td>\n<\/tr>\n<tr>\n<td>Dev Tools<\/td>\n<td>Excellent (Chrome Extension)<\/td>\n<td>Good (built into browser)<\/td>\n<td>Good (Relay DevTools)<\/td>\n<\/tr>\n<tr>\n<td>Pagination Support<\/td>\n<td>fetchMore, field policies<\/td>\n<td>Manual with useQuery variables<\/td>\n<td>Built\u2011in, uses connections (spec)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Table 2: Common Apollo Client Hooks and Their Parameters<\/h2>\n<table border=\"1\" cellpadding=\"8\" cellspacing=\"0\">\n<thead>\n<tr>\n<th>Hook<\/th>\n<th>Required Parameters<\/th>\n<th>Optional Common Options<\/th>\n<th>Returned Object Key Fields<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>useQuery<\/td>\n<td>(query: DocumentNode)<\/td>\n<td>variables, fetchPolicy, pollInterval, skip, notifyOnNetworkStatusChange<\/td>\n<td>loading, error, data, fetchMore, refetch, networkStatus<\/td>\n<\/tr>\n<tr>\n<td>useMutation<\/td>\n<td>(mutation: DocumentNode)<\/td>\n<td>variables, update, optimisticResponse, refetchQueries, onCompleted, onError<\/td>\n<td>[mutate, { loading, error, data, called, client }]<\/td>\n<\/tr>\n<tr>\n<td>useLazyQuery<\/td>\n<td>(query: DocumentNode)<\/td>\n<td>variables, fetchPolicy<\/td>\n<td>[trigger, { loading, error, data }] (trigger is a function)<\/td>\n<\/tr>\n<tr>\n<td>useSubscription<\/td>\n<td>(subscription: DocumentNode)<\/td>\n<td>variables, shouldResubscribe, onSubscriptionData<\/td>\n<td>loading, error, data<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Tips and Best Practices for Using GraphQL with React<\/h2>\n<h3>1. Use Fragments to Keep Queries DRY<\/h3>\n<p>Fragments are reusable units of fields that can be shared across queries and mutations. They reduce duplication and make schema changes easier to manage. Define a fragment for a type, then spread it wherever needed:<\/p>\n<pre><code>const LAUNCH_FRAGMENT = gql`\n  fragment LaunchFields on Launch {\n    id\n    mission_name\n    details\n    rocket {\n      rocket_name\n    }\n  }\n`;\n\nconst GET_LAUNCH = gql`\n  query GetLaunch($id: ID!) {\n    launch(id: $id) {\n      ...LaunchFields\n    }\n  }\n  ${LAUNCH_FRAGMENT}\n`;\n<\/code><\/pre>\n<h3>2. Choose the Right Fetch Policy for Your Use Case<\/h3>\n<p>Apollo gives you several fetch policies: <code>cache-first<\/code> (default), <code>cache-and-network<\/code>, <code>network-only<\/code>, <code>no-cache<\/code>, and <code>cache-only<\/code>. For most static data, <code>cache-first<\/code> is fine. For real\u2011time dashboards, use <code>network-only<\/code> or <code>cache-and-network<\/code> to show stale data while fetching fresh data. For rare writes, consider <code>no-cache<\/code> to avoid polluting the cache. Always test the behavior with the Apollo DevTools.<\/p>\n<h3>3. Handle Errors Gracefully with Error Policies<\/h3>\n<p>GraphQL responses can return both data and errors in the same response (partial errors). Set the <code>errorPolicy<\/code> option to <code>'all'<\/code> if you want to display error messages alongside partial data. The default <code>'none'<\/code> treats any error as a complete failure. For mutations, use <code>onError<\/code> callback to show user\u2011friendly toasts.<\/p>\n<h3>4. Always Use Strict Type Checking with Fragments<\/h3>\n<p>If you use TypeScript (highly recommended), leverage Apollo\u2019s code generation tool to generate types from your GraphQL schema. This eliminates manual typing and catches query errors at compile time. The <code>@graphql-codegen<\/code> package can generate React hooks with strong types that match your server schema.<\/p>\n<h2>Frequently Asked Questions<\/h2>\n<h3>Q1: What is GraphQL and why should I use it with React?<\/h3>\n<p>GraphQL is a query language for APIs that allows clients to request precisely the data they need. Unlike REST, where multiple endpoints often return fixed data structures, GraphQL gives the client control over the response. In React, this means each component can declare its own data dependencies, and Apollo Client automatically manages fetching, caching, and updates. The result is less network overhead, fewer waterfalls, and a more predictable data flow.<\/p>\n<h3>Q2: How does Apollo Client compare to React Query or RTK Query?<\/h3>\n<p>React Query and RTK Query are excellent libraries for data fetching, but they are agnostic to the API type\u2014they work with REST, GraphQL, or any async function. Apollo Client is purpose\u2011built for GraphQL and offers features like normalized caching, subscriptions, and optimistic updates that are tightly integrated with the GraphQL specification. If your backend is GraphQL, Apollo provides the deepest integration. For REST\u2011first projects, React Query may be simpler.<\/p>\n<h3>Q3: How do I handle authentication with GraphQL in React?<\/h3>\n<p>Authentication is typically handled by setting an HTTP header (e.g., <code>Authorization: Bearer &lt;token&gt;<\/code>) on every request. In Apollo, create a <code>setContext<\/code> middleware in the <code>HttpLink<\/code> chain that reads the token from local storage or a React context:<\/p>\n<pre><code>import { setContext } from '@apollo\/client\/link\/context';\n\nconst authLink = setContext((_, { headers }) => {\n  const token = localStorage.getItem('authToken');\n  return {\n    headers: {\n      ...headers,\n      authorization: token ? `Bearer ${token}` : \"\"\n    }\n  };\n});\n\nconst client = new ApolloClient({\n  link: authLink.concat(httpLink),\n  cache: new InMemoryCache()\n});\n<\/code><\/pre>\n<h3>Q4: Can I use local state with Apollo Client?<\/h3>\n<p>Yes, Apollo Client includes reactive variables and the <code>@client<\/code> directive for local state management. You can define local fields that are not part of your remote schema, read them with <code>useQuery<\/code>, and modify them using reactive variables or the <code>cache.writeQuery<\/code> method. For complex applications, you might still want a dedicated state management library, but Apollo can handle many simple use cases without Redux or Zustand.<\/p>\n<h3>Q5: How do I debug GraphQL requests in React?<\/h3>\n<p>Install the Apollo Client DevTools browser extension (Chrome\/Firefox). It provides a full inspector for your GraphQL queries, mutations, cache content, and request history. You can replay queries, inspect loading states, and even simulate network conditions. Additionally, you can enable <code>fetchPolicy<\/code> logging and use the <code>onCompleted<\/code> and <code>onError<\/code> callbacks inside your hooks for in\u2011app debugging.<\/p>\n<h2>Conclusion<\/h2>\n<p>GraphQL and React form a powerful combination that streamlines data management from the UI to the server. In this tutorial, you learned how to set up Apollo Client, write queries and mutations, handle variables, implement optimistic updates, and manage pagination. You also discovered best practices such as using fragments, choosing fetch policies, and debugging with DevTools. Armed with these skills, you can now build React applications that fetch data efficiently, respond immediately to user actions, and scale gracefully as your schema grows. The next step is to practice by building a small project\u2014maybe a note\u2011taking app or a dashboard\u2014and explore advanced features like subscriptions and persisted queries. The GraphQL ecosystem is vast, but with Apollo and React, you have a production\u2011ready stack that will serve you well for years to come. Happy coding!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mastering GraphQL with React: The Ultimate Guide to Efficient Data Fetching Modern single\u2011page applications demand efficient and flexible data fetching. While REST APIs have been the standard for years, they often force developers to either over\u2011fetch or under\u2011fetch data\u2014wasting bandwidth and complicating state management. GraphQL, a query language for APIs, solves these problems by letting &hellip; <\/p>\n","protected":false},"author":2716,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[],"tags":[],"class_list":["post-837","post","type-post","status-publish","format-standard","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/posts\/837","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/users\/2716"}],"replies":[{"embeddable":true,"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/comments?post=837"}],"version-history":[{"count":0,"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/posts\/837\/revisions"}],"wp:attachment":[{"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/media?parent=837"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/categories?post=837"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sumberlaba.com\/index.php\/wp-json\/wp\/v2\/tags?post=837"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}