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之前完成。

  • 相关阅读:
    SpringMVC与Hibernate配置备忘
    Intent在Activity间的传值
    高效的JSON处理_ Jackson
    Ireport+JasperReport制作报表三折线图
    SpringMVC与Ibatis整合开发配置备忘
    Ireport+JasperReport制作报表二JasperReport编译模板
    Android开发之简单计算器
    android平台中解析xml文件:SAX、PULL
    SpringMVC SimpleFormController学习备忘
    java的十个大类
  • 原文地址:https://www.cnblogs.com/Mr147/p/10983956.html
Copyright © 2011-2022 走看看