Moodle REST API

Moodle4.4においてREST APIを有効にする方法を調べました(2024年9月26日時点)。

# Site administration / Web services / Overview 
/admin/settings.php?section=webservicesoverview
というパスを確認します。これがだいたいの作業全体像なのですが，項目に不足があったり，結局まだ間違っていると思われる箇所があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/96d62bdc-d055-97ad-323a-829cbeb92a55.png)

# 1. Enable web services
まずはWeb serviceを有効にします。Overviewから1. Enable web servicesリンクをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/612e4862-e69c-f599-7d63-310270e1c7f8.png)

Enable web servicesにチェックをしてSave changes。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/9c31e536-06e8-b3b3-9b0e-bc2096951b2f.png)

先ほどのOverviewの，1. Enable web servicesがYesになればOKです。

# 2. Enable protocols
Overviewの2. Enable protocolsリンクをクリックします。
Manage protocols画面にて，Activate web service protocolsのREST protocolをEnable(目のアイコンのスラッシュを消す)。
Web services documentationのチェックをOnにします。これでWeb serviceの文書をMoodle上で確認できます。
Save changesで変更を保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/17d6d953-10dc-6d70-7b3d-dde5acb5a318.png)

Overviewの2. Enable protolsがrestになればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/b5d5409a-6806-e192-bc33-f4d217086beb.png)

# 3. Create a specific user
REST APIを使用する専用ユーザを作成します。
Overviewの3. Create a specific userリンクをクリックします。

Usernameは適当で良いです。
Choose an authentication methodをWeb services authenticationにします。
この設定により，本ユーザは，後ほど作成するtokenで認証することになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/0dbe2e40-50a9-d9d4-85f7-001dacadfae3.png)

注意すべき設定項目として，TimezoneとPreferred languageがあります。
この設定にしたがってREST APIのレスポンスが返ってきます。日本語にするとUnicodeがエンコードされて返ってくるので，Englishの方が扱いやすいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/89023a12-e290-a2c1-9124-285dfbfee334.png)

必要な項目を埋めたら，Create userでユーザーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/a8294265-7ab7-a9a8-d971-fb9c4a4f4f58.png)

# 4. Check user capability
ここでいったん，UserのCapabilityを確認しておきます。
Overviewの4. Check user capabilityリンクをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/5c0a3919-7ab5-6d70-34a3-2b3fffd60d39.png)

Capabilitiesの表示画面でFilterにrestと入力して確認すると，
Web service: REST protocolがNoになっています。これをYesにするのが次の作業です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/0db9fb7f-5425-700c-8ddc-19409b16fa65.png)

# Modify Role
Capabilityは直接ユーザに設定するのではなく，roleとして設定されます。なので，roleを設定した上で，ユーザにroleを割り当てます。

まずはPermissions / Define rolesに移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/80362e01-e731-968a-b33d-b1933a607082.png)
ここでManagerのRoleを選択します。
(今回は実験のため，ManagerロールにREST APIの利用権限を与えていますが，セキュリティ面を考慮した場合は別途ロールを作成した方がよいでしょう。)

Viewing the definition of role 'Manager'の下に，灰色のEditボタンがあるので，これを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/d6084329-24a4-c7a4-6de6-e9fb78a31e61.png)
編集画面でFilterにrestを設定すると，Web service: REST protocolを見つけられます。Allowにチェックをします。
Save changesを押して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/a6fd9d8f-b1d0-0358-8143-b44f6edfeb63.png)

再度Managerのroleを確認した画面です。
Use REST protocolがAllowになっていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/de6b176b-4544-1db9-5007-9652f30ec74c.png)

# Assign System role to REST USER
restuserユーザに，Managerを割り当てます。
Permissions / Assign system rolesの画面を表示します。
この時点ではManager roleにUserは割り当てられていません。
RoleからManager(リンク)を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/76a91d79-5b13-a750-7813-58db9b5d717b.png)

Assign role 'Manager' in Systemの画面で，右側のPotential usersからREST USERを選択します。
中央の◀Addを押して追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/9b6562a4-7d03-0cc1-9799-b067b06c03ad.png)

追加されたら，Assign...の上にある灰色のBackボタンで戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/cb146669-673c-9aae-9446-958d8e21cdf2.png)
Users with roleにREST USERが追加されていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/9538c97a-f0d4-3dd0-1567-75c7d0816680.png)

# Create token
REST USERのTokenを作成します。
NameはTokenの名前です。
userにREST USERを指定します(Search▼から選択します)。
ServiceはMoodle mobile web serviceです。
Valid untilは適切に設定しましょう。
Save changesで保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/c4640cec-96ad-08d4-c765-6f8522d48f7a.png)

Save changesを押すと，Manage tokensの画面に遷移します。
ここで，Copy to clipboardを押して，tokenを保存しておきます。
このページから遷移すると再び確認はできません。
Tokenを忘れた場合は再作成することになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/ea7b1d1e-7a7e-0d72-eb55-20dc522b36c5.png)


# Enable mobile web service
上で指定したmobile web serviceは，標準ではOffになっています。このままではREST APIを使用できませんので，Onにします。
Administration / Advanced featuresに，Enable web services for mobile devicesがあります。
チェックをOnにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/7df20848-de75-ca17-31c7-409655616473.png)
Site administrationの検索ボックスでmobileなどとして検索した場合は，Save changesが画面の最後尾にあります。保存し忘れに注意しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/ac2d91eb-8fea-9c69-c2f9-0b508fca06af.png)

# Test the service
これでやっとテストすることができます。しかし，Moodle4.4のOverviewに表示されているAPIはうまく動作しないようです。
ここではcURLを使った操作例を示します。

```
curl -i -X GET \
"https://MOODLE_SITE/webservice/rest/server.php?wstoken=RESTUSER_TOKEN&moodlewsrestformat=json&wsfunction=core_course_get_courses"
```
MOODLE_SITEとRESTUSER_TOKENは適切に置き換えてください(あとhttp，httpsの違いもご自身の環境に合わせてください)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/01630aaa-e8be-654e-5066-1e6f397fb0d7.png)

次はPOSTの例です。

```
curl -i -X POST \
-d "wstoken=RESTUSER_TOKEN" \
-d "moodlewsrestformat=json" \
-d "wsfunction=core_webservice_get_site_info" \
"https://MOODLE_SITE/webservice/rest/server.php"

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/d96a1bb2-9c92-df33-d549-cdd139decae9.png)

もし，パラメータを伴うAPIを使う場合は，Specにしたがってパラメータを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/007fb1d2-e713-7816-9b44-cc0e01c1e775.png)

例えば，以下はコースID=2のコース情報を取得します。
```
curl -i -X POST \
-d "wstoken=RESTUSER_TOKEN" \
-d "moodlewsrestformat=json" \
-d "wsfunction=core_course_get_courses" \
-d 'options[ids][0]=2' \
"https://MOODLE_SITE/webservice/rest/server.php"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2059/4f1dc94d-fb92-9e02-ef2c-2c6f3e9f5789.png)


# まとめ
Moodle4.4でREST APIを使用する設定を行いました。MoodleをCLIからも利用できれば，運用効率が大幅に向上します。もしこの記事の通りにやってもうまくいかない場合は，ご連絡いただけるとありがたいです。