UnityWebRequest的初步使用及常用方法解析_unitywebrequest dispose-程序员宅基地

技术标签: Unity  Web  Unity联网  UnityWebRequest  Unity5.2  

今天,来学习一下Unity新的网络请求方式UnityWebRequest
还是老规矩,先看描述。

描述

UnityWebRequest对象用于与Web服务器通信。

UnityWebRequests处理与Web服务器的HTTP通信流。 其他对象 - 特别是DownloadHandler和UploadHandler - 分别管理下载和上传数据。

注意:一旦UnityWebRequest开始通过调用Send方法与远程服务器通信,UnityWebRequest对象上的大多数属性都无法更改。(Send方法已经过时,用本文下面的例子的方法)

开始使用

通过阅读UnityWebRequest的官方API发现,功能还是挺多的,我们就挑一些常用的说吧。

构造方法

public UnityWebRequest();
public UnityWebRequest(string url);
public UnityWebRequest(Uri uri);
public UnityWebRequest(string url, string method);
public UnityWebRequest(Uri uri, string method);
public UnityWebRequest(string url, string method, Networking.DownloadHandler downloadHandler, Networking.UploadHandler uploadHandler);
public UnityWebRequest(Uri uri, string method, Networking.DownloadHandler downloadHandler, Networking.UploadHandler uploadHandler);

这些构造方法都很普通很常见,这里就不过多说了,其实如果不是有特殊需求,我个人不怎么建议使用这些方法来构造UnityWebRequest对象。

其他实例化方法

其实UnityWebRequest为我们封装了一些常用的公用静态方法,我们完全可以通过这些公用的静态方法来构建一个UnityWebRequest。
常用的有:
Delete
Get
Head
Post
Put
阅读文档可发现,这些封装的方法都会返回一个Networking.UnityWebRequest对象。
这样,我们就可以通过这些方法来构造我们的UnityWebRequest对象了。

简单例子

我写了一个脚本,其中包含了简单的get和post请求,可能会更直观。

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

public class Network : MonoBehaviour {

    void Start () 
    {
        StartCoroutine(Get());
       	StartCoroutine(Post());
    }

    IEnumerator Get()
    {
        UnityWebRequest webRequest = UnityWebRequest.Get("http://www.baidu.com");

        yield return webRequest.SendWebRequest();
        //异常处理,很多博文用了error!=null这是错误的,请看下文其他属性部分
       if (webRequest.isHttpError||webRequest.isNetworkError)
            Debug.Log(webRequest.error);
        else 
        {
            Debug.Log(webRequest.downloadHandler.text);
        }

    }

    IEnumerator Post()
    {
        WWWForm form = new WWWForm();
        //键值对
        form.AddField("key", "value");
        form.AddField("name","mafanwei");
        form.AddField("blog","qwe25878");

        UnityWebRequest webRequest = UnityWebRequest.Post("http://www.baidu.com",form);

        yield return webRequest.SendWebRequest();
        //异常处理,很多博文用了error!=null这是错误的,请看下文其他属性部分
        if (webRequest.isHttpError||webRequest.isNetworkError)
            Debug.Log(webRequest.error);
        else
        {
            Debug.Log(webRequest.downloadHandler.text);
        }
    }

}

脚本解析

其实上面的简单脚本已经满足了大多数情况下我们的使用需求,下面就来讲一下上面的脚本原理。
这里使用了Unity的协程IEnumerator。
协程是什么?
协程是一个能暂停执行,暂停后立即返回,直到中断指令完成后继续执行的函数。
通过yield return,我们就能让他暂停在这里,然后直到有了返回在继续进行下面的代码。
webRequest.SendWebRequest()这个方法就是开始与远程服务器通信。也就是调用这个方法了
UnityWebRequest将执行DNS解析(如有必要),将HTTP请求传输到目标URL处的远程服务器并处理服务器的响应。它返回的是WebRequestAsyncOperation对象,在协程内部产生WebRequestAsyncOperation将导致协程暂停,直到UnityWebRequest遇到系统错误或完成通信。
通过这个,我们就实现了当UnityWebRequest有联网完成后才运行下面的处理代码。
注意
1.调用此方法后,我们将无法更改任何UnityWebRequest的属性。
2.此方法只能在任何给定的UnityWebRequest对象上调用一次。

其他常用方法

public void Abort();

它会尽快结束联网过程,可以随时调用此方法。 如果UnityWebRequest尚未完成,UnityWebRequest将尽快停止上传或下载数据。 中止的UnityWebRequests被认为遇到了系统错误。 isNetworkError或isHttpError属性将返回true,error属性将为“User Aborted”。

如果在调用Send之前调用此方法,则UnityWebRequest将在调用Send后立即中止。

在此UnityWebRequest遇到其他错误或已成功完成与远程服务器的通信后,对此方法的调用无效。

public static string EscapeURL(string s);
public static string EscapeURL(string s, Encoding e);

转义字符串中的字符以确保它们对URL友好。

某些文本字符在URL中存在时具有特殊含义。 如果需要在URL参数中包含这些字符,则必须使用转义序列表示它们。 建议您在将文本作为URL参数传递之前,对用户提供的任何文本使用此函数。 这将确保恶意用户无法操纵URL的内容来攻击Web服务器。 我们也可以使用UnityWebRequest.UnEscapeURL来将URL转译回来。
例子:(在http中&号是链接两个变量的具有特殊意义的字符)

using UnityEngine;
using UnityEngine.Networking;

public class ExampleClass : MonoBehaviour
{
    void Start()
    {
        string escName = UnityWebRequest.EscapeURL("Fish & Chips");
    }
}
public void Dispose();

表示不再使用此UnityWebRequest,并应清理它正在使用的任何资源。

无论请求成功还是失败,我们必须在完成使用UnityWebRequest对象后调用Dispose。

注意:但是这不代表我们需要每次都调用这个方法。因为Unity给我们提供了disposeDownloadHandlerOnDispose和disposeUploadHandlerOnDispose两个bool类型属性。他们的默认值是true,也就是我们不需要设置Unity就会自动在完成后调用Dispose()释放资源。

其他常用属性

public int timeout;

将UnityWebRequest设置为在超时秒数过后尝试中止。

发生超时时,错误返回“请求超时”。 当timeout设置为0时,不会应用超时。此属性默认为0。
注意:设置超时可能适用于Android上的每个网址重定向,这可能会导致更长的响应。

isHttpError

在此UnityWebRequest收到指示错误的HTTP响应代码后返回true。 (只读)

如果响应代码大于或等于400,则为True。

isNetworkError

在UnityWebRequest遇到系统错误后返回true。 (只读)

系统错误的示例包括无法解析DNS条目,套接字错误或超出重定向限制。 当此属性返回true时,error属性将包含描述错误的可读字符串。

注意:错误类型的服务器返回代码(例如404 / Not Found和500 / Internal Server Error)反映在isHttpError属性中,而不是isNetworkError属性中。

public float downloadProgress;

返回介于0.0和1.0之间的浮点值,指示从服务器下载正文数据的进度。 (只读)

注意:仅当服务器的响应包含Content-Length标头并且UnityWebRequest具有附加到downloadHandler属性的DownloadHandler时,此属性才有效。

如果UnityWebRequest已完成(成功或系统错误),则此属性将始终返回1.如果UnityWebRequest仍在与远程服务器通信,并且downloadHandler为null,则此属性将返回0.5。 如果尚未调用Send,则此属性将返回-1。

public float uploadProgress;

返回介于0.0和1.0之间的浮点值,指示将数据上载到服务器的进度。

如果UnityWebRequest完成(成功或系统错误),则此属性将始终返回1.如果UnityWebRequest仍在与远程服务器通信,并且uploadHandler为null,则此属性将返回零。 如果尚未调用Send,则此属性将返回-1。

public string error;

一个可读的字符串,描述此UnityWebRequest对象在处理HTTP请求或响应时遇到的任何系统错误。 (只读)

如果UnityWebRequest未遇到系统错误,则此属性将返回null。 系统错误的示例包括套接字错误,解析DNS条目的错误或超出的重定向限制。

注意:来自服务器的错误类型返回码(例如404 / File Not Found或500 / Internal Server Error)不被视为系统错误。

默认值:null。

public bool isDone;

UnityWebRequest完成与远程服务器通信后返回true。 (只读)

当UnityWebRequest成功完成或遇到系统错误时,此属性将返回true。 DownloadHandler(如果有)的所有后期下载处理将在此属性返回true之前完成。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qwe25878/article/details/85051911

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签