Contentful Management APIについて調査
Contentfulでブログは作ったものの、WebエディタでMarkdownを書こうとすると挙動がおかしくなったりもするので、別途Contentful Management APIでエディタを準備するため調査する
Get all content types of a space API
これで基本的なContent Modelの情報とFieldの情報が取れそう。
fieldsのTypeは のようで、Textは短いと"Symbol"として返ってくるらしい。
Appearanceレベルの情報は取れなさそうなので、通常の1行テキストとSlugは区別がつかなさそう。
Get all tags
これで基本的なTagの情報が取れそう。
エディタとしては一旦IDとnameさえわかればいいかなと思うので、↑だけでとりあえずは不足なさそう。
Get all published assets of a space
これでアップロードされているAsset達の情報が取れそう。
名前は、items→fields→titleがアップロード時につけた名前。
Create an entry
これで作れるらしいが、各種タイプに合わせてどうデータ作ればいいのかがわからないので、(とりあえず自分が使ってるタイプだけ)調査する。
調査: 既存のEntryがどんな感じでデータを持っているかみてみる
Get all entries of a spaceのAPIをたたいて、既存のものに関して確認。
-
Symbol ※1行テキスト
{ "ja-JP": "<文字>" }という形式で保持 -
Link(Asset)
{ "ja-JP": { "sys": { "type": "Link", "linkType": "Asset", "id": "<AssetのID>" } } }
という形式で保持 -
Date
{ "ja-JP": "<ISO 8601の拡張形式>" }という形式で保持 -
Link(他のContent Model)
{ "ja-JP": { "sys": { "type": "Link", "linkType": "Entry", "id": "<>" } }
という形式で保持 -
Text ※複数行テキスト、Rich Textでない
{ "ja-JP": "<文字>" }という形式で保持。改行は\nになる。
調査: 投げてみる
上記から、以下のような感じでデータを作ってCurlで投げてみる。
{
"fields": {
"symboltext": {
"ja-JP": "テスト"
},
"slugtext": {
"ja-JP": "test"
},
"linkasset": {
"ja-JP": {
"sys": {
"type": "Link",
"linkType": "Asset",
"id": "<id>"
}
}
},
"date": { "ja-JP": "2024-04-02T00:00+09:00" },
"linkentry": {
"ja-JP": {
"sys": {
"type": "Link",
"linkType": "Entry",
"id": "<id>"
}
}
},
"text": {
"ja-JP": "文章\n文章"
}
},
"metadata": {
"tags": [
{
"sys": {
"type": "Link",
"linkType": "Tag",
"id": "<id>"
}
}
]
}
}
形式的には問題なかったが、最初は以下のようなレスポンスがかえってきた。
{"sys":{"type":"Error","id":"BadRequest"},"message":"The content type you sent could not be found or was not activated.","requestId":"***"}
どうもheaderのX-Contentful-Content-Typeに対象のContentTypeのIDを入れなければならないようで、Get all content types of a spaceを叩いた時の結果の、itemsのsys内にあるidを入れたら投稿はできた。
APIで作った場合はdraft状態になるようで、別途公開作業する必要がある。
Publish an entry
上記を使う際はentry_idを入れる必要があるが、Create an entryのレスポンスのsys内のidを使えば連続していけそう。
また、ヘッダーで指定する必要のあるX-Contentful-Versionに関しては、sys内のversion`と同じ値を設定しておけばおそらく大丈夫そう。
なお、Publishを行うだけでもversionは上がるっぽい。
Patch an entry
一部の追記(本文の修正など)は上記でいけそう。
ただ、更新方法はJSON Patchに従う必要があるっぽい。
とりあえず以下のとおりで追加してみたが、元々のテキストがまるまる消えてしまった。
[
{
"op": "add",
"path": "/fields/text/ja-JP",
"value": "文字"
},
]
なので、replaceとadd、どちらも変わらなさそう・・・
変更を加えた場合、Entryの状態がchangedになるので、改めて公開作業を行う必要がある。
一旦必要最低限の分は調べ終わったので、クローズ。