文章来源:https://blog.csdn.net/qwe25878/article/details/85051911#_35

今天,来学习一下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之前完成。

【转载】UnityWebRequest的初步使用及常用方法解析的更多相关文章

  1. 前端开发:Javascript中的数组,常用方法解析

    前端开发:Javascript中的数组,常用方法解析 前言 Array是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array ...

  2. JavaScript数组常用方法解析和深层次js数组扁平化

    前言 数组作为在开发中常用的集合,除了for循环遍历以外,还有很多内置对象的方法,包括map,以及数组筛选元素filter等. 注:文章结尾处附深层次数组扁平化方法操作. 作为引用数据类型的一种,在处 ...

  3. Device Tree常用方法解析

    Device Tree常用方法解析 Device Tree在Linux内核驱动中的使用源于2011年3月17日Linus Torvalds在ARM Linux邮件列表中的一封邮件,他宣称“this w ...

  4. Device Tree常用方法解析【转】

    转自:https://blog.csdn.net/airk000/article/details/21345159 Device Tree常用方法解析 Device Tree在Linux内核驱动中的使 ...

  5. Ext.dom.Element 常用方法解析

    Ext.dom.Element 常用方法解析 Ext.Element,Ext.core.Elemen,Ext.dom.Element 这几个类都是一个类,在EXT当中给起了别名而已,这个类到作用主要是 ...

  6. 【转载】Qt之JSON生成与解析

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - December ...

  7. [转载]SpringBoot系列: SpringMVC 参数绑定注解解析

    本文转载自 https://www.cnblogs.com/morethink/p/8028664.html, 作者写得非常好, 致谢! SpringMVC 参数绑定注解解析   本文介绍了用于参数绑 ...

  8. 【转载】linux2.6内核initrd机制解析

    题记 很久之前就分析过这部分内容,但是那个时候不够深入,姑且知道这么个东西存在,到底怎么用,来龙去脉咋回事就不知道了.前段时间工作上遇到了一个initrd的问题,没办法只能再去研究研究,还好,有点眉目 ...

  9. (转载)Android之三种网络请求解析数据(最佳案例)

    [置顶] Android之三种网络请求解析数据(最佳案例) 2016-07-25 18:02 4725人阅读 评论(0) 收藏 举报  分类: Gson.Gson解析(1)  版权声明:本文为博主原创 ...

随机推荐

  1. matlab学习 — 实现简单的爬虫

    这里复杂的情况暂时不考虑..测试网址为pixiv的每日排行榜 = = url = 'https://www.pixiv.net/ranking.php?mode=daily' text = webre ...

  2. iframe结构的网站按F5刷新子页面的实现方式

    有的网站或者后台系统由于页面有公共的部分,比如菜单,会把公共的部分放在一个页面,这里称之为父页面,而把具体的内容放入一个iframe中,之后的请求改变iframe的内容.但是这样会有一个问题,因为浏览 ...

  3. ActiveMQ--模式(队列模式/主题模式)

    两种模式:队列模式/主题模式 pom.xml <dependency> <groupId>org.apache.activemq</groupId> <art ...

  4. Centos7 使用yum安装MariaDB与MariaDB的简单配置与使用

    一.mariadb的安装 MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可. 开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜 ...

  5. Flask - 闪现flash

    1. 像snap一样阅后即焚,在服务器端临时存储数据的地方,如显示错误信息.(也可以用session实现) 2. Flash的底层是session做的,所以要secret_key.可以看源码 3. f ...

  6. ecshop 资料整理

    ecshop 资料整理   lib_base.php 基础函数库1.sub_str($str, $length = 0, $append = true) 截取UTF-8编码下字符串的函数 string ...

  7. 四 动态sql 标签的使用(if&where&sql片段&foreach)

    if标签的使用: userMapper.xml  userMapper.java junit: where标签: 注意:写了where标签就不用手动写where语句 sql片段的设置和调用: forr ...

  8. Rabbitmq概念用法

    MQ全称为Message Queue, 是一种分布式应用程序的的通信方法,它是消费-生产者模型的一个典型的代表,producer往消息队列中不断写入消息,而另一端consumer则可以读取或者订阅队列 ...

  9. quartz spring 实现动态定时任务

    在实际项目应用中经常会用到定时任务,可以通过quartz和spring的简单配置即可完成,但如果要改变任务的执行时间.频率,废弃任务等就需要改变配置甚至代码需要重启服务器,这里介绍一下如何通过quar ...

  10. Android中ListView结合CheckBox判断选中项

    本文主要实现在自定义的ListView布局中加入CheckBox控件,通过判断用户是否选中CheckBox来对ListView的选中项进行相应的操作.通过一个Demo来展示该功能,选中ListView ...