【问题标题】:How to test result of UnityWebRequest?如何测试 UnityWebRequest 的结果?
【发布时间】:2019-09-04 09:40:59
【问题描述】:

我正在尝试在 Unity 中制作游戏原型。我有一个 MySQL 数据库,我可以在其中注册一个用户。

所以我遇到的问题是每当我填写错误的字段时都会收到错误消息。比如发送SQL请求之前需要匹配密码的两个字段,然后加载新场景。

我已尝试使用 if(www.downloadHandler.text == ""),但如果我不填写信息字段,我的测试通过,因为它返回 ""

这是我的 c# 文件:

IEnumerator Insertion()
{
    WWWForm form = new WWWForm();
    form.AddField("Identifiant", IdField.text);
    form.AddField("MotPasse", MdpField.text);
    form.AddField("MotPasseConfi", MdpConfirField.text);
    form.AddField("Email", EmailField.text);
    form.AddField("NoTel", NoTelField.text);

    UnityWebRequest www = UnityWebRequest.Post("http://localhost/AppAndroid/inscription.php", form);
    yield return www.SendWebRequest();


    if (www.isNetworkError || www.isHttpError)
    {
        // It doesn't works, show error message
        Debug.Log(www.error);
        Debug.Log(www.downloadHandler.text);
    }
    else
    {
        // It works, load new scene
        Debug.Log("c'est passé !");
        Debug.Log(www.downloadHandler.text);
    }
}

这是我的 php 文件:

<?php
$SRVusername="root";
$SRVpassword="";
$SRVadress="localhost";
$SRVdatabase="envapp";

$connexion=mysqli_connect($SRVadress,$SRVusername,$SRVpassword,$SRVdatabase);

if(mysqli_connect_errno())
{
    echo "1: Erreur de connexion";
    exit();
}

if(isset($_POST["Identifiant"]) && isset($_POST["MotPasse"]) && isset($_POST["Email"]) && isset($_POST["NoTel"]) && isset($_POST["MotPasseConfi"]))
{
    $Identifiant = $_POST["Identifiant"];
    $MotPasse = $_POST["MotPasse"];
    $Email = $_POST["Email"];
    $NoTel = $_POST["NoTel"];
    $MotPasseConfi = $_POST["MotPasseConfi"];

    if($MotPasse == $MotPasseConfi)
    {
            $checkquery = "INSERT INTO `joueurs` (`ID_JOUEUR`, `PSEUDO`, `PASSWORD`, `EMAIL`, `NUMTEL`) VALUES (NULL, '".$Identifiant."', '".$MotPasse."', '".$Email."', '".$NoTel."');";

            $checkstate = mysqli_query($connexion,$checkquery) or die("4: Erreur lors de la requête " .$checkquery);
    }
    else
    {
        echo "3: Erreur Les mots de passe ne correspondent pas !";
        exit();
    }
}
else
{
    echo "2: Erreur Les POST ne sont pas passés !";
    exit();
}
mysqli_close($connexion);
?>

【问题讨论】:

  • 能否请您添加失败时使用的代码......包括检查以及您如何测试它?

标签: c# php unity3d httprequest


【解决方案1】:

我建议宁愿使用例如http_response_code 设置正确的 http 响应代码(如 500 - 请参阅 list of http response codes),而是使用这些代码进行测试:

<?php
$SRVusername="root";
$SRVpassword="";
$SRVadress="localhost";
$SRVdatabase="envapp";

$connexion=mysqli_connect($SRVadress,$SRVusername,$SRVpassword,$SRVdatabase);

if(mysqli_connect_errno())
{
    printf("1: Erreur de connexion\n");
    http_response_code(500);
    exit();
}

if(isset($_POST["Identifiant"]) && isset($_POST["MotPasse"]) && isset($_POST["Email"]) && isset($_POST["NoTel"]) && isset($_POST["MotPasseConfi"]))
{
    $Identifiant = $_POST["Identifiant"];
    $MotPasse = $_POST["MotPasse"];
    $Email = $_POST["Email"];
    $NoTel = $_POST["NoTel"];
    $MotPasseConfi = $_POST["MotPasseConfi"];

    if($MotPasse == $MotPasseConfi)
    {
            $checkquery = "INSERT INTO `joueurs` (`ID_JOUEUR`, `PSEUDO`, `PASSWORD`, `EMAIL`, `NUMTEL`) VALUES (NULL, '".$Identifiant."', '".$MotPasse."', '".$Email."', '".$NoTel."');";

            if($checkstate = mysqli_query($connexion,$checkquery))
            {
                http_response_code(200);
            } else {
                printf("4: Erreur lors de la requête %s\n", $checkquery);
                http_response_code(500);
                exit();
            }
    }
    else
    {
        printf("3: Erreur Les mots de passe ne correspondent pas !");
        http_response_code(500);
        exit();
    }
}
else
{
    printf("2: Erreur Les POST ne sont pas passés !");
    http_response_code(500);
    exit();
}
mysqli_close($connexion);
?>

那么你就可以完全依赖了

if (www.isNetworkError || www.isHttpError)
{
    // It doesn't works, show error message
    Debug.Log(www.error);
    Debug.Log(www.downloadHandler.text);
}

或者简单地检查响应代码,如

if(www.responseCode != 200) { ... }

或者,对于自定义响应文本,您也可以使用标题,例如,

header($_SERVER["SERVER_PROTOCOL"]. ' ' . 500 . ' ' . "1: Erreur de connexion");

【讨论】:

  • 这就是我要找的...我确定我没有返回任何 Http 错误。谢谢你。
【解决方案2】:

我不知道您在 PHP 中会如何响应,但我的回答是您返回相关的错误代码(在您的情况下可能是 412 - Precondition Failed)。这将允许您检查UnityWebRequest.isHttpError 属性;见here

客户端可以解释响应代码并显示错误(以正确的语言),或者您可以在响应中添加带有详细信息的标头。后者可以通过.GetResponseHeaderproperty访问。

但是,我建议您在发送请求之前验证您可以在 Unity 客户端上执行的操作。密码匹配的简单验证可以轻松检查,并且可以避免您发送您知道会失败的请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多