--- myst: html_meta: "description": "" "property=og:description": "" "property=og:title": "" "keywords": "" --- # Fetching Data Using Plone REST.API Now that we have an idea of how to create nodes, we can move on to retrieving data from a Plone site and creating nodes with that data. All the data from a Plone site is available in the JSON format using {doc}`plone6docs:plone.restapi/docs/source/index`. We will be working a lot with this API while working on the Gatsby source-plugin. It is recommended that you have an API browser to explore the API. Install [Postman](https://www.postman.com/), then go through the quick guide to working with {doc}`plone6docs:plone.restapi/docs/source/usage/exploring`. ```{note} We will use the same endpoints for loading the site in a browser, but set the header `Accept: application/json`. This header tells the endpoint to return JSON data in the response for us to process. ``` ## Exploring The Plone REST.API We will use as our source Plone site, since it's already been configured with the `plone.restapi` and is all ready for our usage. Let us start with the root itself. Send a GET request to . This returns the JSON data for the root of the Plone site. ```json { "@components": { "breadcrumbs": { "@id": "https://demo.plone.org/@breadcrumbs" }, "navigation": { "@id": "https://demo.plone.org/@navigation" }, "workflow": { "@id": "https://demo.plone.org/@workflow" } }, "@id": "https://demo.plone.org", "@type": "LRF", "UID": "7306e5d778be477f8b40bccaad1ecae7", "contributors": [], "created": "2018-10-13T13:25:31+00:00", "creators": [ "admin" ], "description": "", "effective": null, "exclude_from_nav": true, "expires": null, "id": "en", "is_folderish": true, "items": [ { "@id": "https://demo.plone.org/media", "@type": "LIF", "description": "", "review_state": "published", "title": "Media" }, { "@id": "https://demo.plone.org/frontpage", "@type": "Document", "description": "The ultimate Open Source Enterprise CMS", "review_state": "published", "title": "Welcome to Plone 5" }, { "@id": "https://demo.plone.org/demo", "@type": "Folder", "description": "Vestibulum dignissim erat id eros mollis vitae tempus leo ultricies. Cras dapibus suscipit consectetur. Integer tincidunt feugiat tristique. Sed et arcu risus. Nam venenatis, tortor ac tincidunt amet.", "review_state": "published", "title": "Demo" } ], "items_total": 3, "language": "en", "layout": "folder_listing", "modified": "2018-10-13T13:25:32+00:00", "parent": { "@id": "https://plonedemo.kitconcept.com", "@type": "Plone Site", "description": "", "title": "" }, "review_state": "published", "rights": "", "subjects": [], "title": "English", "version": "current" } ``` Let us explore the `items` array from the response and click on `https://demo.plone.org/frontpage`. We see that it gives a similar response as we got for the root. This way all the content objects have equivalent JSON data which our plugin can process and use to create nodes. ### Exercise Create a node for the Plone document at `https://demo.plone.org/demo/a-page`. Test the node created from the retrieved data by displaying some data in the `index` or any other page. Hints: Use Postman to check the data from the endpoint. Refer to the previous section for creating nodes. The Axios library can be used for handling HTTP requests. ```{note} Make sure you send an asynchronous request with the Axios library with `await`. If not, the function will finish execution before the data is even retrieved and pass it as `undefined`. ``` ```{note} Read more about GET requests with Axios in the [official docs](https://www.npmjs.com/package/axios#example). ``` ````{dropdown} Solution :animate: fade-in-slide-down :icon: question ```javascript exports.sourceNodes = async ({ actions }) => { const { createNode } = actions; const { data } = await axios.get('https://demo.plone.org/demo/a-page', { headers: { accept: "application/json", } }); let documentNode = { ...data, id: data["@id"], internal: { type: "PloneDocument", contentDigest: crypto .createHash(`md5`) .update(JSON.stringify(data)) .digest(`hex`), mediaType: "text/html" }, parent: '', children: [], } createNode(documentNode); return; } ``` ```jsx import React from 'react' import { graphql } from 'gatsby' import Layout from '../components/layout' export default ({ data }) => ( {data.allPloneDocument.edges.map(({ node }) => (

{node.title}

{node.description}

))}
) export const query = graphql` query { allPloneDocument { edges { node { id title description } } } } `; ``` ````