質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

1700閲覧

UnityからJsonデータをPOSTで送ることができない(UnityWebRequestを使用)

yukiusagi

総合スコア22

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2017/09/07 14:40

編集2017/09/07 16:01

###前提・実現したいこと
知育ゲームアプリを開発しています。
UnityからUnityWebRequestでJSONをPOSTで送り、サーバー上でその値をもとにデータベースを書き換えたり、データベースを取得したりし、結果としてUnityにJsonを返すという処理を実現したいと思っております。
jsonにはMiniJSONを使っています。

###発生している問題・エラーメッセージ
UnityからUnityWebRequestを使ってPOSTでJsonデータを送っているのですが、サーバでそれを上手く受信することができません。
テストのために、受け取ったデータを加工せずにクライアントに返したとすると、nullになっています。

###該当のソースコード
PHP側のコードはPOSTで送られてきたデータが正確に取得できているかを試すためのコードです。

Unity

1private void Start() 2{ 3 StartCoroutine(Post("http://127.0.0.1:8000/hoge", "{'nickname':'hoge'}")); 4} 5 6IEnumerator Post(string url, string bodyJsonString) 7{ 8 var request = new UnityWebRequest(url, "POST"); 9 byte[] bodyRaw = Encoding.UTF8.GetBytes(bodyJsonString); 10 request.uploadHandler = (UploadHandler)new UploadHandlerRaw(bodyRaw); 11 request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer(); 12 request.SetRequestHeader("Content-Type", "application/json"); 13 14 Debug.Log(request.method); 15 16 yield return request.Send(); 17 18 Debug.Log("Status Code: " + request.responseCode); 19 20 21 // 通信エラーチェック 22 if (request.isNetworkError) 23 { 24 Debug.Log(request.error); 25 } 26 else 27 { 28 if (request.responseCode == 200) 29 { 30 // UTF8文字列として取得する 31 string text = request.downloadHandler.text; 32 Debug.Log(text); 33 34 // バイナリデータとして取得する 35 byte[] results = request.downloadHandler.data; 36 37 Debug.Log(Json.Deserialize(text)); 38 39 } 40 } 41}

Laravel

1Route::post('/hoge', function (Request $request) { 2 $name = $request->nickname; 3 return response()->json(['apple' => $name, 'peach' => $name]); 4});

###試したこと
http://qiita.com/mattak/items/d01926bc57f8ab1f569a
こちらの記事を参考にUnityからJsonを送信しています。

https://ja.stackoverflow.com/questions/10823/laravel-5-%E3%81%A7%E3%81%AEpost%E3%81%A7%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%8C%E3%81%86%E3%81%BE%E3%81%8F%E3%81%84%E3%81%8B%E3%81%AA%E3%81%84
この対策はしました。(コメントアウトで対応済み)

###補足情報(言語/FW/ツール等のバージョンなど)
フレームワーク:Laravel5.4(Php7.1)
クライアント:Unity2017.1
IDE:PhpStorm2017.2
開発環境:Vagrant(Homestead)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

StartメソッドのURLの感じからroutes/web.phpにルート定義を書くとこれはWebページ用なのでRouteServiceProvider記載のweb用のミドルウェア設定の働きにより、Post時にトークン情報を付けないとTokenMismatchExceptionエラー(HTTPステータスは500)が発生しているかもしれません。
その場合はLaravel5.4ならば、APIでのデータのやり取りにはroutes/api.phpの方に書いてみてください。設定したルート定義は「php artisan route:list」で確認してください。
他には送信したJSONデータのフォーマット等がPHPで読み取れない事も考えられます。

投稿2017/09/07 15:46

aro10

総合スコア4106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukiusagi

2017/09/07 15:56

返信ありがとうございます。 トークン問題にも最初遭遇し、今は暫定対応として 'App\Http\Middleware\VerifyCsrfToken',をコメントアウトすることで対処いたしました。 phpStormのRESTクライアントによるとエラーは出ないようには至ったのですが、そこから先が上手くいかず万事休す状態です…orz PhpStormのRESTクライアントでいろいろ試してみたところ、<link rel='stylesheet' type='text/css' property='stylesheet'~以下略 というレスポンスが入っていることを確認いたしました。
aro10

2017/09/07 16:13 編集

その感じだとJSONデータが期待されるところがHTMLデータが帰ってきてしまっているので、ヘッダーに「"Accept: application/json"」をつけるとJSONデータが返ってくるかもしれません。 curlでのPOSTですが以下参考記事です。 [20121110 curl を使って JSONデータをPOSTする(http://takuya71.hatenablog.com/entry/2012/11/10/143415) あとは、HTMLが返ってくる場合は、多分エラーページが返ってきているので何かしらエラーになっているかと思います。 PHPStormのRESTClientを使ってみましたが、Preview表示のような物が見当たらなかったので、Chorme拡張のPostman等を使うとHTMLレスポンスがレンダリングして見れるのでエラー確認もわかりやすいかもしれません。 またクライアントからのリクエスの生のデータを見たい時は、Request::getContent()で取得できます。
yukiusagi

2017/09/07 16:22 編集

現状進捗: ご教示ありがとうございます。まだ解決までは至っておりませんが、一歩前進しました。ありがとうございます。 Postmanで、Headersに [Content-Type:application/json]と[Accept:application/json]を設定し、Bodyに { "nickname":"hoge" } を設定したところ、正確なjsonが返ってきました。 -- となると、Unity側からサーバへ上手くjsonが渡っていないのが原因でしょうか。 引き続き自分でも試行錯誤してみます。
guest

0

StartCoroutine(Post("http://127.0.0.1:8000/hoge", "{"nickname":"hoge"}"));

[Accept:application/json]を追加し、Postmanを使うことでサーバとクライアントのどちらのコードに問題があるかのかを把握することができました。ありがとうございます。
また、Unity側のjsonとポストマン側を比較し、Unityのコードを↑に修正すると無事に思い通りのデータを取得できました。
無事疑問解決できました。ありがとうございました。

投稿2017/09/07 16:29

yukiusagi

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問