zoukankan      html  css  js  c++  java
  • 【转载】UnityWebRequest的初步使用及常用方法解析

    文章来源: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之前完成。

  • 相关阅读:
    多测师讲解html _伪类选择器17_高级讲师肖sir
    多测师讲解html _后代选择器16_高级讲师肖sir
    多测师讲解html _组合选择器_高级讲师肖sir
    多测师讲解html _标签选择器14_高级讲师肖sir
    前端 HTML form表单标签 input标签 type属性 重置按钮 reset
    前端 HTML form表单标签 textarea标签 多行文本
    前端 HTML form表单标签 input标签 type属性 file 上传文件
    前端 HTML form表单标签 input标签 type属性 radio 单选框
    前端 HTML form表单标签 input标签 type属性 checkbox 多选框
    前端 HTML form表单目录
  • 原文地址:https://www.cnblogs.com/Mr147/p/10983956.html
Copyright © 2011-2022 走看看