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

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

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

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

PHP

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

Unity

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

Q&A

解決済

2回答

1379閲覧

Unity側からhttpでフォームをサーバーにPOSTしたい

nishi835

総合スコア15

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

PHP

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

Unity

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

0グッド

0クリップ

投稿2019/11/24 19:16

編集2019/11/24 19:21

やりたいこと

UnityWebRequestの機能を使って、フォームをサーバーにPOSTしたい。

状況

Unity側でエラーが出ないにもかかわらず、サーバー側のページに変化がありません。

結果その1

$_POSTが空のまま
イメージ説明
送信エラーはなし
イメージ説明

やってみたこと

試しに、htmlでフォームを作ってPostしたところ、普通に送信できました。
イメージ説明

結果その2

イメージ説明

送信側(Unity)

C#

1using UnityEngine; 2using UnityEngine.Networking; 3using System.Collections; 4 5class Manager : MonoBehaviour { 6 void Start() { 7 StartCoroutine(Upload()); 8 } 9 10 IEnumerator Upload() { 11 WWWForm form = new WWWForm(); 12 form.AddField("myField", "myData"); 13 using(UnityWebRequest www = UnityWebRequest.Post("http://hogehoge.com/PHPTest/phpcatch.php", form)) { 14 www.chunkedTransfer = false; 15 yield return www.SendWebRequest(); 16 17 if(www.isNetworkError || www.isHttpError) { 18 Debug.Log(www.error); 19 } else { 20 Debug.Log("Form upload complete!"); 21 } 22 } 23 } 24}

送信側(html)

html

1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>post_reg1</title> 5</head> 6<body> 7 8<h1>POST送信</h1> 9<form method="post" action="phpcatch.php"> 10<input type="text" name="name" size="15" value="TRYPHP"> 11<input type="submit" value="送信"> 12</form> 13 14</body> 15</html>

受信側

php

1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>post_reg2</title> 5</head> 6<body> 7 8<h1>POST受信</h1> 9<?php 10 echo "POST:"; 11 print_r($_POST); 12?> 13 14</body> 15</html>

最後に

要するにやりたいことは、Unityのゲーム上から何らかの形でWebページ等にフィードバックを送信することです。
間違いなどありましたら、ご教示お願い致します。

補足

Unityの送信側のURLには間違いがない前提で回答お願いします。(送信エラーもないので)

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

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

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

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

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

guest

回答2

0

試してみましたが、クライアントであるUnityのプログラム側からはHTTPリクエストは正しく送信されます。表示できない云々は、恐らくサーバー側の問題でしょう。

C#

1UnityWebRequest.Post("http://192.168.1.100:8000/PHPTest/phpcatch.php", form)

として実行すると、サーバー側(この例では192.168.1.100:8000)で、以下のようなPOSTメソッドのHTTPリクエストを受信できています。一見すると一応ちゃんとしたformの形ではあるので、サーバー側でこのリクエストを意図通り処理できていないのだと思われます。

bash

1$ nc -l 8000 2POST /PHPTest/phpcatch.php HTTP/1.1 3Host: 192.168.1.100:8000 4User-Agent: UnityPlayer/2018.3.1f1 (UnityWebRequest/1.0, libcurl/7.52.0-DEV) 5Accept: */* 6Accept-Encoding: identity 7Content-Type: application/x-www-form-urlencoded 8X-Unity-Version: 2018.3.1f1 9Content-Length: 14 10 11myField=myData

Unityのバージョンは
Version 2018.3.1f1 (bb579dc42f1d) Personal
Mon, 24 Dec 2018 10:33:46 GMT
Branch: 2018.3/staging
で、Windows 7 Ultimate(64ビット)上で確認しました。

投稿2019/11/25 01:39

dodox86

総合スコア9183

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

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

m.ts10806

2019/11/25 01:47

状況見た感じ、質問者はphpの画面開いて待ち構えてて「何も変化がない」と言ってるのかなという印象でしたが、そういうことではないんですかね?
dodox86

2019/11/25 01:56

あ、なるほど。当初、質問とm.ts10806 さんの回答の流れを理解できませんでしたが、そういう前提であればそうですね。 >質問者nishi835さん > 要するにやりたいことは、Unityのゲーム上から何らかの形でWebページ等にフィードバックを送信することです。 「フィードバック」と言われていることが、今、PCのブラウザ上に表示させているWEBページにリアルタイムに状況表示させたい、と言うことを指しているのであれば、m.ts10806 さんの回答のとおりです。
m.ts10806

2019/11/25 02:03

確かに流れ分かりにくかったかもしれませんね。私も勉強になりました
nishi835

2019/11/25 03:45

おっしゃるように、phpの画面をブラウザで開いて待ち構えて、unityを実行してからブラウザを更新する、みたいなことをしていました。 最初のご回答の方に質問を追加しましたので、まだお付き合いいただけるようでしたら、ご回答お願い致します。
guest

0

ベストアンサー

API的な使い方がされるのでPHPの画面の方には何も変化はないですよ。form送信で送ったリクエストではないですしね。
Ajaxと同じくリクエストが送信された元に出力結果を返すだけです。
つまり、通常は内部で処理だけさせて実行結果の正否だけ返すように組みます。
「とりあえずPOSTが通ったか確認したい」のでしたら$_POSTをそのままjson_encode()した結果を出力してUnity側で返り値をデバッグ確認するか、PHP側でログ出力するかのどちらかの手段を取ってください。

投稿2019/11/24 21:39

m.ts10806

総合スコア80850

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

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

nishi835

2019/11/24 22:19

ご回答ありがとうございます。 自分はネットワークやサーバーについて全く無知なので、正直とんちんかんな質問だったかと思います。 せっかくご丁寧にお答えいただいたのですが、内容があまり理解できません。 ひとつひとつお聞きすると質問だらけになってしまいますので、まずは自力で調べようと思います。 その上でひとつだけお聞きしたいのですが、結論だけ言うと、UnityWebRequestの仕組みを、上記のようなサーバーへの情報伝達に用いることがそもそも不適切でしょうか。
nishi835

2019/11/24 22:35

サーバーへの伝達、というか、サーバー上のwebページへのテキスト等の送信、というようなことです。
m.ts10806

2019/11/24 23:04

Unity詳しいわけではないですが、「フィードバックを送信」は別に悪いわけではありません。 送信した内容をDBに保存する仕組みをWeb側に持たせるとか、内容の閲覧をするとかですね。 閲覧は「送信された内容を見る」のではなく「DBに保存された情報を確認する」用途になるのでUnityは直接絡みません(WebViewとかで表示させるのであればまた違いますが) 今回の使い方はあくまで「PHPにリクエストを送って処理結果をレスポンスとして受けとる」やり方のようなので、php側の画面表示はありません。 php側に出力された内容はそのままUnityに返ってきてるだけです。 JavaScriptを用いたAjaxと考え方は同じですね。
nishi835

2019/11/25 03:42

ありがとうございます。 今回のUnityWebRequestの処理は、あくまでサーバーからのレスポンスをunity側で貰うためのやり方で、php側の表示は変化しない、変化させたいなら、サーバー側(php)でデータベースに保存したり、閲覧したりする仕組みを作る必要がある、というような理解で合ってますでしょうか。 HTMLのフォームで送信するのとは、根本的にやり方が異なるのでしょうか。
m.ts10806

2019/11/25 04:33

htmlのフォーム送信はaction属性には指定した先に向かって送信するので、「送信しつつ画面遷移」の形となります。 今回の場合は、APIとしての利用となるので「画面遷移」の形とはならず、あくまでUnity側からリクエストを送り、実行結果をそのままUnityで受けとる形になります。 実行結果のレスポンスをUnityで確認してみましたか? おそらくphpcatch.phpの出力結果すべてhtmlとして返ってきたのではないでしょうか。 いずれにしても「今回phpが請け負う仕事、位置付け」を明確にされないことには対応の方向性は決まらないと思います。
dodox86

2019/11/25 05:53 編集

> HTMLのフォームで送信するのとは、根本的にやり方が異なるのでしょうか。 UI/画面遷移の観点からすると根本的に違う、と言うこともできるかもしれませんが、HTTP通信の観点からするとブラウザ<-->サーバー間、Unityプログラム<-->サーバー間でまったく違いはありません。クライアントであるブラウザ、またはUnityプログラムからHTTPリクエスト(本質問の場合はPOSTメソッドのform)を送り、サーバーはそれに対してHTTPレスポンスを返す。そのHTTPレスポンス中にhtmlが含まれているのであれば、ブラウザはそのhtmlから画面を構築して表示しますし、Unityプログラムは今の質問者さんの if(www.isNetworkError || www.isHttpError) のコードのように、結果をチェックするくらいしかできないでしょう。それはAjaxを使っても同じです。ブラウザ内でjQuery/Ajaxを使った場合でもHTTPリクエスト-->HTTPレスポンスのやり取りは逐一行われています。ブラウザの画面表示の一部分が更新され続ける(<ようにプログラムしている場合)だけです。 m.ts10806さんの以下のコメントについて私も同意します。 > いずれにしても「今回phpが請け負う仕事、位置付け」を明確にされないことには対応の方向性は決まらないと思います。 長々とm.ts10806さんの回答コメント欄にて失礼しました。以降は控えます。
m.ts10806

2019/11/25 05:52

dodox86さん 補足大変助かります。
nishi835

2019/11/25 07:36

お二方、大変ありがとうございます。 正直、質問の意図が明確でなく、混乱を招いてしまったように思います。お詫び致します。 基本的なwebの仕組みを今一度しっかり学んで、今回のご回答を今後に生かそうと思います。
m.ts10806

2019/11/25 07:44

前提や背景、できれば自身がとった操作まできちんと書いてあるのが理想です。 回答者は確かに経験も知識もあるかもかしれませんが、イレギュラーは必ずあるわけで、どんな可能性を加味して考えたとしても「推測」の域はでません。 「推測」はあくまで「推測」なので質問要件と合致しなければ無駄になることもあります。 どんな経験をしていても、あくまで回答者は他人なので推測しなければならないことがスタートから多い状態なのです。 少しでもずれがあれば全く明後日の方向にいくこともあります。 そのずれを少しでもなくすべく、質問者がわには持ちうる情報は全て出してほしいと常日頃から願っています。(質問者の認識が甘いための追記修正依頼ですが、ちゃんと応じられないと当然回答は得られにくいですし、それでやりとりして浪費するくらいなら始めからしっかり書いてあった方がお互い楽なのです)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問