こんにちは。
最近、Moodleのサーバーを立ててみたりしているのですが、調べているとMoodleにはREST APIがあることを知りました。
これはちょっと面白いことができるんじゃないかと、試してみたのですがなかなか詰まったので次回以降スムーズにできるようにコチラにメモしておきます。
Moodleとは
Moodleとは、オープンソースの学習管理システム(LMS)です。
オープンソースのLMSとしては最も有名なもので、世界中で使われているようです。
日本でも、大学の基幹システムとして使われていることが多いような気がします。
ベースとしてはPHPで動いているようですが、Webエンジニアとしてはあまり触りたくない(カオスな)システムとしても有名です。
Moodle内の設定方法
REST APIを触るためには、Moodle内で設定を行う必要があります。
Moodleの管理者権限でログインし、Site administration > Server > Web services > Overview に移動します。
Step 1: Enable web services をクリックし、Webサービスを有効にします。
Step 2: Enable protocols をクリックし、RESTを有効にします。
Step 5: Select a service をクリックし、Addをクリックします。
Nameは自分がわかるようにすればOKです。
Enableにチェックを入れるのを忘れないようにしましょう。
Authorized users onlyにもチェックを入れておくことをお勧めします。
その後、もう一度Step 5: Select a service をクリックし、先ほど作成したサービスのAuthorize usersをクリックします。
そこで自分のアカウントを選択し、Addをクリックします。
次に、Step 6: Add functions をクリックし、先ほど作成したサービスのFunctionsをクリックします。
遷移後の画面で、Add functionsをクリックします。
Nameでの検索画面が表示されるので、そこにcore_user_create_users
と入力し、出て来た項目を選択後、Add functionsをクリックします。
次に、Step 8: Create a token for a userをクリックし、Userとして自分のアカウント、サービスとして先ほど作成したサービス名を選択し、Save Changesをクリックします。
すると、Tokenが表示されるので、これをメモしておきます。
ここまでで設定は完了です。
MoodleのREST APIを叩く
MoodleのREST APIのドキュメントは、以下のURLがよくまとまっています。
- http://{あなたのmoodleのドメイン}/admin/webservice/documentation.php
- https://docs.moodle.org/dev/Creating_a_web_service_client
REST APIといいながら、かなりクセのあるAPIです。
まず、APIのURLは以下のようになります。
http://{あなたのmoodleのドメイン}/webservice/rest/server.php?wstoken={先ほど取得したToken}&wsfunction={実行したい関数名}&moodlewsrestformat=json
そして、リクエストはすべてGETで行います。
追加のパラメータは、&{パラメータ名}={値}
の形式で指定します。
今回の例では、以下のようになります。
http://{あなたのmoodleのドメイン}/webservice/rest/server.php?wstoken={先ほど取得したToken}&wsfunction=core_user_create_users&moodlewsrestformat=json&users[0][username]=testuser&users[0][firstname]=Hoge&users[0][lastname]=Fuga&users[0][email]=example@example.com&users[0][password]=Pass-w0rd
これをcurlで叩いて、Moodleのアカウントを作成してみます。
curl -g 'http://{あなたのmoodleのドメイン}/webservice/rest/server.php?wstoken={先ほど取得したToken}&wsfunction=core_user_create_users&moodlewsrestformat=json&users[0][username]=testuser&users[0][firstname]=Hoge&users[0][lastname]=Fuga&users[0][email]=example@example.com&users[0][password]=Pass-w0rd'
以下のようなレスポンスが返ってくれば成功です。
[{"id":1,"username":"testuser"}]
今回はこのあたりで。