10
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

フロントから Contentful への POST リクエストの方法がドキュメントを見ても分かりにくかったのでまとめた

Posted at

はじめに

JAMStack でサービスを作りたいなと思い、前から気になってたヘッドレス CMS の Contentful を使ってみました。
ブラウザから投稿するのは簡単でしたが、フロントから Contentful へ POST リクエストをする方法がドキュメントを見ても分かりにくかったのでまとめました。
いろんな方法があると思うので、あくまで一例として参考になれば幸いです。

##設定条件
【対象】 Contentful を導入済みで、すでに GET の方法までは確認済みの方。

【ゼロから始める場合】以下の設定から始めます。

Contentful の導入から GET まではこちらの記事が参考になります :point_down_tone2:
(引用:ぐるたかログ「 Nuxt に Contentful を設定する方法。導入からデータ取得までの流れをまとめてみた【スクショあり】」)

POST 用に API キーを作成する

自分専用の POST 用 API キー(トークン)を作成する必要があります。

① Contentful 上で、作成済のスペースのメニューの Settings で API Keys を選択

スクリーンショット 2020-05-07 17.16.53.png

② Content management tokens を選択し、「 Generate personal token 」ボタンで自分専用のトークンを作成する(トークンはメモしておく:writing_hand_tone2:

スクリーンショット 2020-05-07 17.15.05.png

##環境 ID ・コンテントタイプ ID を確認(メモする:writing_hand_tone2:

環境 ID・・・スペースのメニュー「 Setting 」 → 「 Environments 」 → 「 Environment ID 」
スクリーンショット 2020-05-07 13.23.43.png

コンテントタイプ ID ・・・スペースのメニュー「 Content 」 → 「 Info 」 → 「 CONTENT TYPE ID 」
スクリーンショット 2020-05-07 17.41.52.png

.env で変数にして nuxt.config.js に追記する

.env にメモした上記 3 つを追記します。今回自作したトークンは「 CTF_FOR_MY_APP_TOKEN 」としています。
その後、nuxt.config.js ファイルの env 欄に下記のように追記します。
スクリーンショット 2020-05-07 18.11.55.png

スクリプトにコードを記述

POST 用のページを今回は Nuxt.js で作成しているので、script タグ以下に記述。
フォーム入力のデータは v-model で紐付けをしています。
まずは必要な定数を定義します。
トークンは先程設定した自作トークンの内容です。

new.vue
const contentful = require('contentful-management')
const client = contentful.createClient({
  accessToken: process.env.CTF_FOR_MY_APP_TOKEN
})

フォームのデータ部分も最初は null で入力しておきます。(単語帳として、v-model で紐付け済)

new.vue
data() {
  return {
    formData: {
      word: null,
      meaning: null
    }
  }
},

POST 用のメソッドを作成

Contentful のスペースにアクセスして、環境 ID を呼び出し新規エントリー(POST 内容)を作成する流れです。
環境 ID なしで最初行いましたが、非推奨ということなので書き換えました。
createEntry する際はコンテントタイプ ID が必要になります。

new.vue
methods: {
  async postWord() {
    const mySpace = await client.getSpace(process.env.CTF_SPACE_ID)
    const myEnvironment = await mySpace.getEnvironment(
      process.env.CTF_ENVIRONMENT_ID
    )
    const res = await myEnvironment.createEntry(
      process.env.CTF_CONTENT_TYPE_ID,
      {
        fields: {
          word: {
            'en-US': this.formData.word
          },
          meaning: {
            'en-US': this.formData.meaning
          }
        }
      }
    )
    await res.publish()
    console.log(res)
  }
}

:speaking_head: 注意ポイント

Contentful の仕様上、fields 内に POST する内容を入れていきますが、上記のようにバリデーションを指定してオブジェクト形式にしないとエラーが出てしまうので要注意です。

あと、POST するだけだとドラフトのままなので、 publish() で最後に公開状態に変更しています。

##まとめ
Contentful は POST でリクエストする際のオブジェクトの書き方が特殊で、ドキュメントを参考にしても分かりにくい部分が多いですが、GET で扱う場合はいろんな扱い方が出来そうなので可能性は大きそうです。
仕様に慣れれば使いやすそうなので(もちろん Contentful のサイトから直接投稿するのは簡単です)、他でも使っていきたいと思います :smiley:

10
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?