ぐーるらいふ

底辺。

【Unity】 NCMB 405 エラー Method not Allowed 【オンラインランキング】

お疲れ様です。ぐーるです。unity1weekお疲れ様でした。
その記事を書いているのですが、その前に一個メモしておきたいことが。
お恥ずかしいミスなのですが…。

NCMBって何?

クラウド上に用意された機能をAPIで使用するだけでサーバ開発、運用不要で
バックエンドサービスを利用することが出来るサービスのことをmBaasと言いまして、
niftyが提供しているmBaasを

nifty cloud mobile backend == NCMB

と呼んでいるようです。まぁ楽にサーバ機能を使うことが出来るものです。
unity SDKも用意されていて、簡単に使うことが出来ます。
使い方はググると公式もありますし、沢山記事もあるので割愛します。

mbaas.nifcloud.com

mbaas.nifcloud.com

Method not allowed????

NCMBを利用してデータをテーブルに追加する時に以下のようなコードを書きます。

    public void TestSend(string objectId , string name , int score)
    {
        NCMBObject obj = new NCMBObject("TestTable");
        obj.ObjectId = objectId;
        obj["name"] = name;
        obj["score"] = score;

        obj.SaveAsync((NCMBException e) =>
        {
            if (e == null)
            {
                Debug.Log("success");
            }
            else
            {
                //エラー処理
                Debug.LogError(e);
            }
        });
    }

このSaveAsyncで以下のエラーが出てしまいました。

【url】:https://mb.api.cloud.nifty.com/xxxxxxxxxxxxxxx/TestTable/
【type】:PUT
【content】:{"name":"test user name","score":8307}

【StatusCode】:405
【Error】:NCMB.NCMBException: Method not allowed.
【ResponseData】:

これなんだろう?と。

原因

NCMBを利用してデータを入れる際は以下のように判定されます。

obj.ObjectId = objectId; <- ここ

obj.ObjectId [ null ] == 新規レコードを追加 
obj.ObjectId [ (存在しているObjectId) ] == 該当レコードを更新

となります。
ちなみに、新規レコード追加した際にobj.ObjectIdに値が入って返ってくるため、
その値を利用して次回以降は更新することが出来ます。

ここが以下の値だとエラーになります

obj.ObjectId [ (存在していないObjectId) ] == 404エラー No data available.

【url】:https://mb.api.cloud.nifty.com/xxxxxxxxxxxxxx/TestTable/aaaaa
【type】:PUT
【content】:{"name":"name","score":2595}
UnityEngine.Debug:Log(Object)

【StatusCode】:404
【Error】:NCMB.NCMBException: No data available.
【ResponseData】:
UnityEngine.Debug:Log(Object)
obj.ObjectId [ "" ] == 405エラー Method not allowed.

【url】:https://mb.api.cloud.nifty.com/xxxxxxxxxxxx/TestTable/
【type】:PUT
【content】:{"name":"test user name","score":8307}

【StatusCode】:405
【Error】:NCMB.NCMBException: Method not allowed.
【ResponseData】:

となります。つまりObjectIdが""だと、エラーになってしまう…と。

反省

NCMBを利用する時に、簡単に考えると
「ObjectIdはPrayerPrefsにでも保存しとくか」
と考えてこんなコードを書いてしまいました。

obj.ObjectId = PlayerPrefs.getString("NCMB_ObjectId");

これで""になってしまってたのが原因…。はずかしー。

ちゃんとデフォルト値を入れとけって事ですね。反省。

obj.ObjectId = PlayerPrefs.GetString("NCMB_ObjectId" , null);