Maxime Castres 28f1d6df86
Integration documentation (#7282)
* Cleanup shelljs

Signed-off-by: Alexandre Bodin <bodin.alex@gmail.com>

* Bump koa-session from 5.13.1 to 6.0.0 (#7254)

Bumps [koa-session](https://github.com/koajs/session) from 5.13.1 to 6.0.0.
- [Release notes](https://github.com/koajs/session/releases)
- [Changelog](https://github.com/koajs/session/blob/master/History.md)
- [Commits](https://github.com/koajs/session/compare/5.13.1...6.0.0)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Fix #7252: fix relation name
fix regression issue due to pull #7204

Signed-off-by: Akash P <aksdevac@gmail.com>

* v3.1.3

* Add React Integration

* Remove character

* Created a new component for less code

* Review modifications

* Review modifications 2

* Add Vue.js, Next.js, Nuxt.js, Gatsby and GraphQL inte

* Change Select with Checkboxes

* Remove useless fonction in Next.js

* Update Next.js

* Update Next.js 2

* Update Vue.js and Nuxt.js

* Update React and Next.js

* Update Post example

* Update all

* Last reviews

Co-authored-by: Alexandre Bodin <bodin.alex@gmail.com>
Co-authored-by: Alexandre BODIN <alexandrebodin@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Akash P <aksdevac@gmail.com>
2020-08-17 10:29:04 -07:00

776 lines
15 KiB
Markdown

# Getting Started with Nuxt.js
This integration guide is following the [Getting started guide](../getting-started/quick-start.html). We assume that you have completed [Step 8](../getting-started/quick-start.html#_8-consume-the-content-type-s-api) and therefore can consume the API by browsing this [url](http://localhost:1337/restaurants).
If you haven't gone through the getting started guide, the way you request a Strapi API with [Nuxt.js](https://nuxtjs.org/) remains the same except that you will not fetch the same content.
### Create a Nuxt.js app
Create a basic Nuxt.js application with [create-nuxt-app](https://github.com/nuxt/create-nuxt-app).
:::: tabs
::: tab yarn
```bash
yarn create nuxt-app nuxtjs-app
```
:::
::: tab npx
```bash
npx create-nuxt-app nuxtjs-app
```
:::
::::
### Use an HTTP client
Many HTTP clients are available but in this documentation we'll use [Axios](https://github.com/axios/axios) and [Fetch](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API).
:::: tabs
::: tab @nuxtjs/strapi
For this example we are using the awesome [@nuxt/strapi](https://strapi.nuxtjs.org/) module.
```bash
yarn add @nuxtjs/strapi
```
- Add `@nuxtjs/strapi` to the module section of `nuxt.config.js` with the following settings
```js
modules: ['@nuxtjs/strapi'],
strapi: {
entities: ['restaurants', 'categories'],
url: 'http://localhost:1337'
},
```
:::
::: tab axios
```bash
yarn add axios
```
:::
::: tab fetch
No installation needed
:::
::::
### GET Request your collection type
Execute a GET request on the `restaurant` Collection Type in order to fetch all your restaurants.
Be sure that you activated the `find` permission for the `restaurant` Collection Type.
:::: tabs
::: tab @nuxtjs/strapi
*Request*
```js
try {
await this.$strapi.find('restaurants')
} catch (error) {
console.log(error);
}
```
:::
::: tab axios
*Request*
```js
import axios from 'axios'
axios.get('http://localhost:1337/restaurants')
.then(response => {
console.log(response);
})
```
:::
::: tab fetch
*Request*
```js
fetch("http://localhost:1337/restaurants", {
method: "GET",
headers: {
'Content-Type': 'application/json'
},
}).then(response => response.json())
.then(data => console.log(data));
```
:::
*Response*
```json
[{
"id": 1,
"name": "Biscotte Restaurant",
"description": "Welcome to Biscotte restaurant! Restaurant Biscotte offers a cuisine based on fresh, quality products, often local, organic when possible, and always produced by passionate producers.",
"created_by": {
"id": 1,
"firstname": "Paul",
"lastname": "Bocuse",
"username": null
},
"updated_by": {
"id": 1,
"firstname": "Paul",
"lastname": "Bocuse",
"username": null
},
"created_at": "2020-07-31T11:37:16.964Z",
"updated_at": "2020-07-31T11:37:16.975Z",
"categories": [{
"id": 2,
"name": "French Food",
"created_by": 1,
"updated_by": 1,
"created_at": "2020-07-31T11:36:23.164Z",
"updated_at": "2020-07-31T11:36:23.172Z"
}]
}]
```
::::
### Example
:::: tabs
::: tab @nuxt/strapi
`./pages/index.vue`
```js
<template>
<div class="container">
<div v-if="error">
{{ error }}
</div>
<ul v-else>
<li v-for="restaurant in restaurants" :key="restaurant.id">
{{ restaurant.name }}
</li>
</ul>
</div>
</template>
<script>
export default {
name: 'App',
data () {
return {
restaurants: [],
error: null
}
},
async mounted () {
try {
this.restaurants = await this.$strapi.find('restaurants')
} catch (error) {
this.error = error
}
}
}
</script>
```
:::
::: tab axios
`./pages/index.vue`
```js
<template>
<div class="container">
<div v-if="error">
{{ error }}
</div>
<ul v-else>
<li v-for="restaurant in restaurants" :key="restaurant.id">
{{ restaurant.name }}
</li>
</ul>
</div>
</template>
<script>
import axios from 'axios'
export default {
name: 'App',
data () {
return {
restaurants: [],
error: null
}
},
async mounted () {
try {
const response = await axios.get('http://localhost:1337/restaurants')
this.restaurants = response.data
} catch (error) {
this.error = error;
}
}
}
</script>
```
:::
::: tab fetch
`./pages/index.vue`
```js
<template>
<div id="app">
<div v-if="error">
{{ error }}
</div>
<ul v-else>
<li v-for="restaurant in restaurants" :key="restaurant.id">
{{ restaurant.name }}
</li>
</ul>
</div>
</template>
<script>
export default {
name: 'App',
data () {
return {
restaurants: [],
error: null,
headers: {'Content-Type': 'application/json'}
}
},
methods: {
parseJSON: function (resp) {
return (resp.json ? resp.json() : resp);
},
checkStatus: function (resp) {
if (resp.status >= 200 && resp.status < 300) {
return resp;
}
return this.parseJSON(resp).then((resp) => {
throw resp;
});
}
},
async mounted () {
try {
const response = await fetch("http://localhost:1337/restaurants", {
method: 'GET',
headers: this.headers,
}).then(this.checkStatus)
.then(this.parseJSON);
this.restaurants = response
} catch (error) {
this.error = error
}
}
}
</script>
```
:::
::::
### POST Request your collection type
Execute a POST request on the `restaurant` Collection Type in order to create a restaurant.
Be sure that you activated the `create` permission for the `restaurant` Collection Type and the `find` permission for the `category` Collection type.
:::: tabs
::: tab @nuxtjs/strapi
```js
try {
await this.$strapi.create('restaurants', {
name: 'Dolemon Sushi',
description: 'Unmissable Japanese Sushi restaurant. The cheese and salmon makis are delicious',
categories: [
3
]
})
} catch (error) {
this.error = error
}
```
:::
::: tab axios
*Request*
```js
import axios from 'axios'
axios.post('http://localhost:1337/restaurants', {
name: 'Dolemon Sushi',
description: 'Unmissable Japanese Sushi restaurant. The cheese and salmon makis are delicious',
categories: [
3
]
})
.then(response => {
console.log(response);
})
```
:::
::: tab fetch
*Request*
```js
fetch('http://localhost:1337/restaurants', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'Dolemon Sushi',
description: 'Unmissable Japanese Sushi restaurant. The cheese and salmon makis are delicious',
categories: [
3
]
})
}).then(response => response.json())
.then(data => console.log(data));
```
:::
*Response*
```json
{
"id": 2,
"name": "Dolemon Sushi",
"description": "Unmissable Japanese Sushi restaurant. The cheese and salmon makis are delicious",
"created_by": null,
"updated_by": null,
"created_at": "2020-08-04T09:57:11.669Z",
"updated_at": "2020-08-04T09:57:11.669Z",
"categories": [{
"id": 3,
"name": "Japanese",
"created_by": 1,
"updated_by": 1,
"created_at": "2020-07-31T11:36:23.164Z",
"updated_at": "2020-07-31T11:36:23.172Z"
}]
}
```
::::
### Example
:::: tabs
::: tab @nuxtjs/strapi
`./pages/index.vue`
```js
<template>
<div class="container">
<div v-if="error">
{{ error }}
</div>
<form id="form" v-on:submit="handleSubmit" v-else>
<h3>Restaurants</h3>
<br>
<label for="name">Name</label>
<input id="name" v-model="modifiedData.name" type="text" name="name">
<label for="description">Description</label>
<input id="description" v-model="modifiedData.description" type="text" name="description">
<div>
<br />
<b>Select categories</b>
<br>
<div v-for="category in allCategories" :key="category.id">
<label>{{ category.name }}</label>
<input
type="checkbox"
:value="category.id"
v-model="modifiedData.categories"
name="categories"
:id="category.id"
/>
</div>
</div>
<br>
<input type="submit" value="Submit">
</form>
</div>
</template>
<script>
export default {
name: 'App',
data() {
return {
allCategories: [],
modifiedData: {
name: '',
description: '',
categories: [],
},
error: null
}
},
async mounted() {
try {
this.allCategories = await this.$strapi.find('categories')
} catch (error) {
this.error = error
}
},
methods: {
handleSubmit: async function(e) {
e.preventDefault();
try {
await this.$strapi.create('restaurants', this.modifiedData)
} catch (error) {
this.error = error
}
}
}
}
</script>
```
:::
::: tab axios
`./pages/index.vue`
```js
<template>
<div id="app">
<div v-if="error">
{{ error }}
</div>
<form id="form" v-on:submit="handleSubmit" v-else>
<label for="name">Name</label>
<input id="name" v-model="modifiedData.name" type="text" name="name">
<label for="description">Description</label>
<input id="description" v-model="modifiedData.description" type="text" name="description">
<div>
<br />
Select categories
<div v-for="category in allCategories" :key="category.id">
<label>{{ category.name }}</label>
<input
type="checkbox"
:value="category.id"
v-model="modifiedData.categories"
name="categories"
:id="category.id"
/>
</div>
</div>
<input type="submit" value="Submit">
</form>
</div>
</template>
<script>
import axios from 'axios'
export default {
name: 'App',
data() {
return {
allCategories: [],
modifiedData: {
name: '',
description: '',
categories: [],
},
error: null
}
},
async mounted() {
try {
const response = await axios.get('http://localhost:1337/categories')
this.allCategories = response.data;
} catch (error) {
this.error = error;
}
},
methods: {
handleSubmit: async function(e) {
e.preventDefault();
try {
const response = await axios.post('http://localhost:1337/restaurants', this.modifiedData)
console.log(response);
} catch(error) {
this.error = error;
}
}
}
}
</script>
```
:::
::: tab fetch
`./pages/index.vue`
```js
<template>
<div id="app">
<div v-if="error">
{{ error }}
</div>
<form id="form" v-on:submit="handleSubmit" v-else>
<h3>Restaurants</h3>
<br>
<label for="name">Name</label>
<input id="name" v-model="modifiedData.name" type="text" name="name">
<label for="description">Description</label>
<input id="description" v-model="modifiedData.description" type="text" name="description">
<div>
<br />
<b>Select categories</b>
<br>
<div v-for="category in allCategories" :key="category.id">
<label>{{ category.name }}</label>
<input
type="checkbox"
:value="category.id"
v-model="modifiedData.categories"
name="categories"
:id="category.id"
/>
</div>
</div>
<br>
<input type="submit" value="Submit">
</form>
</div>
</template>
<script>
export default {
name: 'App',
data() {
return {
allCategories: [],
modifiedData: {
name: '',
description: '',
categories: [],
},
error: null,
headers: {'Content-Type': 'application/json'}
}
},
async mounted() {
try {
const allCategories = await fetch("http://localhost:1337/categories", {
method: 'GET',
headers: this.headers,
}).then(this.checkStatus)
.then(this.parseJSON);
this.allCategories = allCategories
} catch (error) {
this.error = error
}
},
methods: {
parseJSON: function (resp) {
return (resp.json ? resp.json() : resp);
},
checkStatus: function (resp) {
if (resp.status >= 200 && resp.status < 300) {
return resp;
}
return this.parseJSON(resp).then((resp) => {
throw resp;
});
},
handleSubmit: async function(e) {
e.preventDefault();
try {
const response = await fetch('http://localhost:1337/restaurants', {
method: 'POST',
headers: this.headers,
body: JSON.stringify(this.modifiedData)
}).then(this.checkStatus)
.then(this.parseJSON);
console.log(response);
} catch (error) {
this.error = error
}
}
}
}
</script>
```
:::
::::
### PUT Request your collection type
Execute a PUT request on the `restaurant` Collection Type in order to update the category of a restaurant.
Be sure that you activated the `put` permission for the `restaurant` Collection Type.
:::: tabs
We consider that the id of your restaurant is `2`
and the id of your category is `3`
::: tab @nuxtjs/strapi
```js
try {
await this.$strapi.update('restaurants', 2, {
categories: [
3
]
})
} catch (error) {
this.error = error
}
```
:::
::: tab axios
*Request*
```js
import axios from 'axios'
axios.put('http://localhost:1337/restaurants/2', {
categories: [
3
]
})
.then(response => {
console.log(response);
})
```
:::
::: tab fetch
*Request*
```js
fetch('http://localhost:1337/restaurants/2', {
method: "PUT",
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
categories: [
3
]
})
})
.then(response => response.json())
.then(data => {
console.log(data);
})
```
:::
*Response*
```json
{
"id": 2,
"name": "Dolemon Sushi",
"description": "Unmissable Japanese Sushi restaurant. The cheese and salmon makis are delicious",
"created_by": null,
"updated_by": null,
"created_at": "2020-08-04T10:21:30.219Z",
"updated_at": "2020-08-04T10:21:30.219Z",
"categories": [{
"id": 3,
"name": "Japanese",
"created_by": 1,
"updated_by": 1,
"created_at": "2020-08-04T10:24:26.901Z",
"updated_at": "2020-08-04T10:24:26.911Z"
}]
}
```
::::
## Conclusion
Here is how to request your Collection Types in Strapi using Nuxt.js. When you create a Collection Type or a Single Type you will have a certain number of REST API endpoints available to interact with.
We just used the GET, POST and PUT methods here but you can [get one entry](../content-api/api-endpoints.html#get-an-entry), [get how much entry you have](../content-api/api-endpoints.html#count-entries) and [delete](../content-api/api-endpoints.html#delete-an-entry) an entry too. Learn more about [API Endpoints](../content-api/api-endpoints.html#api-endpoints)