Unity UnityWebRequest Get与Post应用

学习目标:

using LitJson;
using Newtonsoft.Json;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using UnityEngine;
using UnityEngine.Networking;

public class WebRequestTest :MonoBehaviour
{
    public delegate void HttpHelperPostGetCallbacks(long code, HttpHelperRequests request, HttpHelperResponses rsponse);

    //Http请求信息
    [Serializable]
    public struct HttpHelperRequests
    {
        //请求地址
        public string url;
        //表单字段
        public JsonData filelds;
        //表头
        public JsonData headers;
        public string token;
        public string session;
    }

    //Http返回信息
    [Serializable]
    public struct HttpHelperResponses
    {
        //返回Http状态码
        public long code;
        //返回http提示信息
        public string message;
        //请求接口时返回的头字典
        public Dictionary<string, string> headers;
        //请求API接口时返回的文本内容
        public string text;
        //请求返回的字节数值
        public byte[] bytes;
        //下载完成时返回的Texture
        public Texture texture;
        //下载资源时用到的线程
        public Thread thread;
        //下载的AB
        public AssetBundle bundle;

        /// <summary>
        /// 将text反序列化成T类型
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public T Deserialize<T>()
        {
            return JsonConvert.DeserializeObject<T>(this.text);
        }
    }



    #region UnityWebRequest
    private void SendRequest(string url, HttpHelperPostGetCallbacks callback, JsonData fields = null, JsonData header = null, int timeout = 5)
    {
        StartCoroutine(_SendRequest(url, callback, fields, header, timeout));
    }

    IEnumerator _SendRequest(string url, HttpHelperPostGetCallbacks callback, JsonData fields = null, JsonData header = null, int timeout = 5)
    {
        using (UnityWebRequest webRequest = new UnityWebRequest(url))
        {
            webRequest.timeout = timeout;
            yield return webRequest.SendWebRequest();

            //组装 请求信息
            HttpHelperRequests request = new HttpHelperRequests();
            request.url = url;
            request.filelds = fields;
            request.headers = header;

            //组装 返回信息
            HttpHelperResponses response = new HttpHelperResponses();
            response.code = webRequest.responseCode;
            response.message = webRequest.error;
            response.headers = webRequest.GetResponseHeaders();
            response.text = webRequest.downloadHandler.text;
            response.bytes = webRequest.downloadHandler.data;

            //调用 委托
            callback?.Invoke(webRequest.responseCode, request, response);

            //结束 处理占用资源
            //尽快停止UnityWebRequest
            webRequest.Abort();
            //默认值是true,调用该方法不需要设置Dispose(),Unity就会自动在完成后调用Dispose()释放资源。
            webRequest.disposeDownloadHandlerOnDispose = true;
            //不再使用此UnityWebRequest,并应清理它正在使用的任何资源
            webRequest.Dispose();
        }

    }


    #endregion


    #region Post方法 
    /*
     Post方法将一个表上传到远程的服务器,一般来说我们登陆某个网站的时候会用到这个方法,我们的账号密码会以一个表单的形式传过去。
    */

    #region POST普通表单请求,支持Header,Authorization
    /// <summary>
    /// POST普通表单请求
    /// POST普通表单参数请求 - 数据以Parameters形式发送
    /// </summary>
    /// <param name="url">目标URL</param>
    /// <param name="callback">请求完成回调</param>
    /// <param name="fields">表单字段</param>
    /// <param name="header">请求头字典, 默认Content-Type=application/json</param>
    /// <param name="timeout"></param>
    private void Post(string url, HttpHelperPostGetCallbacks callback, JsonData fields = null,JsonData header = null, int timeout = 5)
    {
        StartCoroutine(_Post(url, callback, fields, header, timeout));
    }

    IEnumerator _Post(string url,HttpHelperPostGetCallbacks callback, JsonData fields = null,JsonData header = null,int timeout = 5)
    {
        using (UnityWebRequest webRequest = UnityWebRequest.Post(url,fields!=null?fields.ToJson():null))
        {
            //设定超时
            webRequest.timeout = timeout;
            //设置请求头  根据实际需求来
            webRequest.SetRequestHeader("Authorization", "");
            //开始与远程服务器通信
            //等待通行完成
            yield return webRequest.SendWebRequest();

            //组装 请求信息
            HttpHelperRequests request = new HttpHelperRequests();
            request.url = url;
            request.filelds = fields;
            request.headers = header;

            //组装 返回信息
            HttpHelperResponses response = new HttpHelperResponses();
            response.code = webRequest.responseCode;
            response.message = webRequest.error;
            response.headers = webRequest.GetResponseHeaders();
            response.text = webRequest.downloadHandler.text;
            response.bytes = webRequest.downloadHandler.data;

            //调用 委托
            callback?.Invoke(webRequest.responseCode, request, response);

            //结束 处理占用资源
            //尽快停止UnityWebRequest
            webRequest.Abort();
            //默认值是true,调用该方法不需要设置Dispose(),Unity就会自动在完成后调用Dispose()释放资源。
            webRequest.disposeDownloadHandlerOnDispose = true;
            //不再使用此UnityWebRequest,并应清理它正在使用的任何资源
            webRequest.Dispose();
        }
    }
    #endregion

    
    #region POST RawBody请求,支持Header,Authorization
    /// <summary>
    /// 进行POST请求,数据以Raw格式携带在Body中进行请求
    /// </summary>
    /// <param name="url">目标URL地址</param>
    /// <param name="callback">回调完成函数</param>
    /// <param name="fields">携带数据</param>
    /// <param name="header"></param>
    /// <param name="timeout"></param>
    private void PostRaw(string url, HttpHelperPostGetCallbacks callback, JsonData fields = null, JsonData header = null, int timeout = 5)
    {
        StartCoroutine(_PostRaw(url, callback, fields, header, timeout));
    }

    IEnumerator _PostRaw(string url,HttpHelperPostGetCallbacks callback, JsonData fields,JsonData header,int timeout = 5)
    {
        using (UnityWebRequest webRequest = UnityWebRequest.Post(url,"POST"))
        {
            //负责拒绝或接受在https请求中收到的证书,用于Https请求中的证书处理
            webRequest.certificateHandler = new CustomCertHandler();
            //设定超时
            webRequest.timeout = timeout;
            //设置信息头  根据实际需求来
            webRequest.SetRequestHeader("Content-Type", "application/json;");
            //处理请求头设置
            if (header != null)
            {
                foreach (var item in header.Keys)
                {
                    webRequest.SetRequestHeader(item, header[item].ToString());
                }
            }
            //设置携带数据
            if (fields != null)
            {
                webRequest.uploadHandler = new UploadHandlerRaw(System.Text.Encoding.UTF8.GetBytes(fields.ToJson()));
            }
            yield return webRequest.SendWebRequest();


            //组装 请求信息
            HttpHelperRequests request = new HttpHelperRequests();
            request.url = url;
            request.filelds = fields;
            request.headers = header;

            //组装 返回信息
            HttpHelperResponses response = new HttpHelperResponses();
            response.code = webRequest.responseCode;
            response.message = webRequest.error;
            response.headers = webRequest.GetResponseHeaders();
            response.text = webRequest.downloadHandler.text;
            response.bytes = webRequest.downloadHandler.data;


            //调用 委托
            callback?.Invoke(webRequest.responseCode, request, response);

            //结束 处理占用资源
            //尽快停止UnityWebRequest
            webRequest.Abort();
            //默认值是true,调用该方法不需要设置Dispose(),Unity就会自动在完成后调用Dispose()释放资源。
            webRequest.disposeDownloadHandlerOnDispose = true;
            //不再使用此UnityWebRequest,并应清理它正在使用的任何资源
            webRequest.Dispose();
        }
    }

    #endregion

    #endregion


    #region GET方法 

    #region GET普通表单请求,支持Header,Authorization
    /// <summary>
    /// 普通GET请求
    /// </summary>
    /// <param name="url">Get请求目标URL</param>
    /// <param name="callback">请求完成回调函数</param>
    /// <param name="fields">标单字段数据,Dictionary类型 </param>
    /// <param name="header">请求Header数据,Dictionary类型 </param>
    /// <param name="timeout">超时时间  默认5秒</param>
    public void Get(string url, HttpHelperPostGetCallbacks callback, JsonData fields = null, JsonData header = null, int timeout = 5)
    {
        StartCoroutine(_Get(url, callback, fields, header, timeout));
    }

    private IEnumerator _Get(string url, HttpHelperPostGetCallbacks callback, JsonData fields = null, JsonData header = null, int timeout = 5)
    {
        string targetUrl = url;
        StringBuilder sb = new StringBuilder();

        if (fields != null)
        {
            foreach (var Key in fields.Keys)
            {
                sb.Append(Key + "=" + fields[Key] + "&");
            }
            if (url.Contains("?"))
            {
                targetUrl = url + "&" + sb.ToString();
            }
            else
            {
                targetUrl = url + "?" + sb.ToString();
            }

            targetUrl = targetUrl[targetUrl.Length - 1] == '&' ? targetUrl.Substring(0, targetUrl.Length - 1) : targetUrl;
        }

        using (UnityWebRequest webRequest =  UnityWebRequest.Get(targetUrl))
        {
            //设定超时
            webRequest.timeout = timeout;
            //处理请求头设置
            webRequest.SetRequestHeader("Authorization", "");
            if (header != null)
            {
                foreach (var item in header.Keys)
                {
                    webRequest.SetRequestHeader(item.ToString(), header[item].ToString());
                }
            }
            yield return webRequest.SendWebRequest();


            //组装 请求信息
            HttpHelperRequests request = new HttpHelperRequests();
            request.url = url;
            request.filelds = fields;
            request.headers = header;

            //组装 返回信息
            HttpHelperResponses response = new HttpHelperResponses();
            response.code = webRequest.responseCode;
            response.message = webRequest.error;
            response.headers = webRequest.GetResponseHeaders();
            response.text = webRequest.downloadHandler.text;
            response.bytes = webRequest.downloadHandler.data;

            //调用 委托
            callback?.Invoke(webRequest.responseCode, request, response);

            //结束 处理占用资源
            //尽快停止UnityWebRequest
            webRequest.Abort();
            //默认值是true,调用该方法不需要设置Dispose(),Unity就会自动在完成后调用Dispose()释放资源。
            webRequest.disposeDownloadHandlerOnDispose = true;
            //不再使用此UnityWebRequest,并应清理它正在使用的任何资源
            webRequest.Dispose();
        }
    }
    #endregion

    #endregion



}

学习内容:

提示:这里可以添加要学的内容
例如:
1、 搭建 Java 开发环境
2、 掌握 Java 基本语法
3、 掌握条件语句
4、 掌握循环语句


学习时间:

提示:这里可以添加计划学习的时间
例如:
1、 周一至周五晚上 7 点—晚上9点
2、 周六上午 9 点-上午 11 点
3、 周日下午 3 点-下午 6 点


学习产出:

提示:这里统计学习计划的总量
例如:
1、 技术笔记 2 遍
2、CSDN 技术博客 3 篇
3、 学习的 vlog 视频 1 个

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: UnityWebRequest.PostUnity中的一个类,用于向服务器发送POST请求。它可以用于向服务器发送数据,例如表单数据、JSON数据等。使用UnityWebRequest.Post可以方便地与服务器进行通信,并获取服务器返回的数据。 ### 回答2: UnityWebrequestUnity引擎提供的一个用于网络通信的类库,其中post是其中最常用的方法之一。它是通过HTTP协议向服务器提交数据的一种方式,相比于get方法更加安全可靠。 在使用post方法时,需要向服务器发送一段特定格式的数据,这段数据包含了要向服务器传递的参数以及参数的值。这些数据需要以键值对的方式组织,并使用特定的分隔符进行连接。在 UnityWebrequest.post 方法中,参数需要通过一个Dictionary<string,string>类型的参数进行传递。例如: Dictionary<string, string> postParams = new Dictionary<string, string>(); postParams["username"] = "user1"; postParams["password"] = "password1"; UnityWebRequest www = UnityWebRequest.Post("http://www.example.com/login", postParams); yield return www.SendWebRequest(); if (www.isNetworkError || www.isHttpError) { Debug.LogError(www.error); } else { Debug.Log("Form upload complete!"); } 在上述示例中,向 http://www.example.com/login 发送了一个POST请求。参数使用了一个Dictionary<string,string>对象,其中包含了用户名和密码两个参数及其对应的值。在发送请求后,我们需要等待服务器的响应结果。如果请求成功,我们可以获取服务器返回的数据并进行处理。如果请求失败,则会抛出 NetworkError或 HttpError 异常,可以根据具体的错误信息进行处理。 UnityWebrequest.postUnity引擎中一个十分强大、常用的API,具备广泛的适用性,在开发各种类型的游戏时都可以使用。 如果开发者想进行网络通信,就可以选择UnityWebrequest.post方法,实现安全、可靠、高效的数据传输。 ### 回答3: UnityWebRequest.postUnity中用于在Http协议下向远程服务器发送POST请求的API。它可以用于向服务器传递表单数据、上传文件和进行基于HTTP协议的远程调用等操作。 通过UnityWebRequest.post方法可以设置请求的URL、请求的体、请求头、超时时间等请求参数。在发送请求之后可以通过异步的方式获取响应结果,通过设置回调函数处理获得的响应结果。在处理请求的过程中,还可以根据需要设置请求的超时时间、POST方式、上传内容和返回格式等操作。 UnityWebRequest.post能够满足我们许多实际开发中的需求,比如向服务器上传文件、进行后台数据请求等。此外,UnityWebRequest.post还具备多线程操作等多种优点,可以提高网络请求的效率。 总之,UnityWebRequest.postUnity中用于进行Http协议下的POST请求的API,它可以完成许多网络请求的操作。了解和掌握这个API是Unity网络开发中的基本技能,也是开发者必不可少的技能之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值