Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3D C#WWW类:在每次请求后执行代码_C#_Web_Unity3d_Webrequest - Fatal编程技术网

Unity3D C#WWW类:在每次请求后执行代码

Unity3D C#WWW类:在每次请求后执行代码,c#,web,unity3d,webrequest,C#,Web,Unity3d,Webrequest,我在网上找不到任何线索,因为我想很多人都放弃了Unity的WWW课程,去学习复杂的东西。我正在使用WWW类与我的restapi对话,我需要找到一种方法在每个请求之后执行一些代码。(如果响应为401,我需要检查响应代码并执行一些默认行为) 有没有一个简单的方法来实现这一点 (我正在使用协同路由发送请求) 提前谢谢 更新:当前代码示例 Auth.cs: public IEnumerator Login(WWWForm data, Action<APIResponse> success,

我在网上找不到任何线索,因为我想很多人都放弃了Unity的WWW课程,去学习复杂的东西。我正在使用WWW类与我的restapi对话,我需要找到一种方法在每个请求之后执行一些代码。(如果响应为401,我需要检查响应代码并执行一些默认行为)

有没有一个简单的方法来实现这一点

(我正在使用协同路由发送请求)

提前谢谢

更新:当前代码示例

Auth.cs:

public IEnumerator Login(WWWForm data, Action<APIResponse> success, Action<APIResponse> failure)
    {
        WWW request = new WWW (API + "auth/authenticate", data);
        yield return request;
        if (request.responseHeaders ["STATUS"] == "HTTP/1.1 401 Unauthorized") {
            //Do something, I want to do this on every request, not just on this login method
        }
        if (request.error != null) {
            failure (new APIResponse(request));
        }
        else {
            //Token = request.text.Replace("\"", "");
            Token = request.text;
            Debug.Log (Token);
            success (new APIResponse (request));
        }

    }
public IEnumerator登录(WWWForm数据、操作成功、操作失败)
{
WWW请求=新的WWW(API+“验证/认证”,数据);
退换货请求;
if(request.responseHeaders[“STATUS”]=“HTTP/1.1 401未经授权”){
//做点什么,我想在每个请求上都这样做,而不仅仅是在这个登录方法上
}
if(request.error!=null){
失败(新的APIResponse(request));
}
否则{
//Token=request.text.Replace(“\”,”);
Token=request.text;
Debug.Log(令牌);
成功(新的APIResponse(request));
}
}
用法:

StartCoroutine (auth.Login (data, new Action<APIResponse> (response => {
            //Do stuff

        }), new Action<APIResponse> (response => {
            //Do stuff
        })));
start例程(auth.Login)(数据、新操作(响应=>{
//做事
}),新操作(响应=>{
//做事
})));

我没有使用WWW和rest api来实现“异步”方式,使用超时和异常处理对我来说很有效:

public static string PostJson(string host, string resourceUrl, object json)
{
    var client = new RestClient(host);
    client.Timeout = Settings.LIGHT_RESPONSE_TTL; //set timeout duration

    var request = new RestRequest(resourceUrl, Method.POST);
    request.RequestFormat = DataFormat.Json;
    request.AddBody(json);

    try
    {
        var response = client.Execute(request);
        return response.Content;
    }
    catch (Exception error)
    {
        Utils.Log(error.Message);
        return null;
    }

}
要使用此功能,请执行以下操作:

var result = JsonUtils.PostJson("http://192.168.1.1:8080", "SomeEndPoints/abc/def", jsonString);
if (string.IsNullOrEmpty(result))
{
     //Error
}
else
{
      //Success
}
更新:要确保此类调用不会阻止UI,请使用以下代码:

Loom.RunAsync(() => {
    var result = JsonUtils.PostJson("http://192.168.1.1:8080", "SomeEndPoints/abc/def", jsonString);
    if (!string.IsNullOrEmpty(result)) {

    }
});
您可以下载绝缘布。下面的GIF动画可以演示此类代码的示例使用,请注意,UI(圆形指示器)未被阻止


我认为Unity不支持RestSharp,如果我错了,请纠正我的错误,但我认为它不会在iOS上运行。它是绝对受支持的,请将.net framework更改为3.5。在播放器设置中,我已经这样做了数百万次,:)。此外,您应该使用与.net 3.5兼容的版本的RestSharp,您可以轻松下载它从github或其他地方。你也可以尝试JsonFX!啊,太完美了!但我真的不想在请求花费比预期稍长的时间时阻止UI,你有一个使用此库的异步的示例吗?如果你在非UI线程中运行此示例,它将根本不会阻止UI。我有一个示例,它在json为po时显示了一个循环指示符更新了我的帖子,加入了一些代码。