【Unity】 NCMB 405 エラー Method not Allowed 【オンラインランキング】
お疲れ様です。ぐーるです。unity1weekお疲れ様でした。
その記事を書いているのですが、その前に一個メモしておきたいことが。
お恥ずかしいミスなのですが…。
NCMBって何?
クラウド上に用意された機能をAPIで使用するだけでサーバ開発、運用不要で
バックエンドサービスを利用することが出来るサービスのことをmBaasと言いまして、
niftyが提供しているmBaasを
nifty cloud mobile backend == NCMB
と呼んでいるようです。まぁ楽にサーバ機能を使うことが出来るものです。
unity SDKも用意されていて、簡単に使うことが出来ます。
使い方はググると公式もありますし、沢山記事もあるので割愛します。
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);