以统一方式创建令牌以将发布请求发送到laravel控制器

时间:2017-02-16 21:18:05

标签: unity3d laravel-5

我想从团结游戏发送一个帖子请求到laravel 5.4控制器...以html格式,我们使用{{csrf_field}}并处理创建令牌。但我怎么能团结一致呢?

3 个答案:

答案 0 :(得分:2)

我遇到了这个线程,同时试图实现它打算要执行的操作-并且使它起作用了,所以我要分享一下:

它是YouTube上的本教程:How to Use UnityWebRequest - Replacement for WWW Class - Unity Tutorial和类似问题的答案:UnityWebRequest POST to PHP not work

的组合

我正在使用的技术:

  • Laravel Framework 7.15.0(PHP)
  • 团结:2019.3.11f1(脚本是C#)

现在,我只是发送基本表单,而不发送图像等-所以我没有尝试任何复杂的操作,但这会向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请求可能是有意义的。