我想从团结游戏发送一个帖子请求到laravel 5.4控制器...以html格式,我们使用{{csrf_field}}并处理创建令牌。但我怎么能团结一致呢?
答案 0 :(得分:2)
我遇到了这个线程,同时试图实现它打算要执行的操作-并且使它起作用了,所以我要分享一下:
它是YouTube上的本教程:How to Use UnityWebRequest - Replacement for WWW Class - Unity Tutorial和类似问题的答案:UnityWebRequest POST to PHP not work
的组合我正在使用的技术:
现在,我只是发送基本表单,而不发送图像等-所以我没有尝试任何复杂的操作,但这会向Laravel上的一个URL发送一个get消息,该URL返回CSRF令牌。
然后将其作为附加字段添加到发布请求中。
我非常快地单击了两个按钮-我建议(稍后将自己实施),直到准备好提交表单时才要求输入令牌-避免表单过长而过期等
C#脚本(统一)
这两个功能都设置为ON(在Unity中简单UI画布中的按钮上单击)。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
public class BasicWebCall : MonoBehaviour
{
public Text messageText;
public InputField scoreToSend;
private string csrf_token;
readonly string getURL = "http://mazegames.test/leaderboard/1";
readonly string postURL = "http://mazegames.test/register/1";
private void Start()
{
messageText.text = "Press buttons to interact with web server";
}
public void OnButtonGetScore()
{
messageText.text = "Getting Token";
StartCoroutine(SimpleGetRequest());
}
IEnumerator SimpleGetRequest()
{
UnityWebRequest www = UnityWebRequest.Get(getURL);
yield return www.SendWebRequest();
if(www.isNetworkError || www.isHttpError)
{
Debug.LogError(www.error);
}
else
{
messageText.text = "Token Received: " + www.downloadHandler.text;
csrf_token = www.downloadHandler.text;
}
}
public void OnButtonSendScore()
{
if (scoreToSend.text == string.Empty)
{
messageText.text = "Error: No high score to send.\nEnter a value in the input field.";
}
else
{
messageText.text = "Sending Post Request";
StartCoroutine(SimplePostRequest(scoreToSend.text));
}
}
IEnumerator SimplePostRequest(string curScore)
{
Dictionary<string, string> wwwForm = new Dictionary<string, string>();
wwwForm.Add("_token", csrf_token);
UnityWebRequest www = UnityWebRequest.Post(postURL, wwwForm);
yield return www.SendWebRequest();
if (www.isNetworkError || www.isHttpError)
{
Debug.LogError(www.error);
}
else
{
messageText.text = www.downloadHandler.text;
}
}
}
Laravel路由/web.php
很显然,您需要配置端点以接收数据,并在必要时进行验证和存储。在此示例中,它只是在发布请求中验证令牌。
Route::post('register/{game_id}', function($game_id) {
return "Game On!";
});
Route::get('leaderboard/{game_id}', function($game_id) {
return csrf_token();
});
这就是它的大部分-希望这对其他人有帮助。
#EDIT#-提交时请求令牌
要仅在提交表单时获取令牌,实际上您需要做的就是以下行:
StartCoroutine(SimpleGetRequest());
在行上方
StartCoroutine(SimplePostRequest(scoreToSend.text));
所以看起来像这样:
StartCoroutine(SimpleGetRequest());
StartCoroutine(SimplePostRequest(scoreToSend.text));
显然,您可以完全删除功能SimpleGetRequest。
答案 1 :(得分:0)
您可以使用WWWForm在POST中发送并从协程中调用它:
// this will send it at start
// but you can just call SendToController in another function
string laravel_url = "http://somedomain.com/whatever";
IEnumerator Start () {
yield return StartCoroutine(SendToController());
}
IEnumerator SendToController()
{
WWWForm form = new WWWForm();
form.AddField( "csrf_field", "replace this with what you want!!!!" );
WWW download = new WWW( laravel_url, form );
yield return download;
if(!string.IsNullOrEmpty(download.error)) {
print( "Error downloading: " + download.error );
} else {
// if succesful, do what you want
Debug.Log(download.text);
}
}
&#34;协程&#34;是你的朋友。这将使发送表单更容易。你可能想在这里阅读它: https://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html
答案 2 :(得分:0)
每次生成页面时,Laravel都会生成一个令牌。该令牌具有生命周期,在该生命周期之后它不再被使用(这是重点)。
您需要从Laravel获取有效令牌,然后将其传递给Unity3D,然后从Unity创建 WWWForm 并将其传回。
如何做到这一点取决于部署Unity3D的平台。 如果您正在使用WebPlayer或WebGL,那么您可以在浏览器中嵌入Unity3D对象并使用SendMessage。 WebGL链接here。
如果将游戏部署到另一个平台,那么在Laravel端公开和API并使用该端点而不是执行POST请求可能是有意义的。