UnityWebRequest是新的网络请求Api,分为LLApi和HLApi,其中LLApi为低级api,所谓低级api是指只是提供最基本的api接口,然后需要通过不同的参数来确定请求方式。为此unity提供了高级api(HLApi)即对不同的功能进行了封装,以下基于HLApi做了简单封装。

using System.Collections;
using System;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
using System.Collections.Generic;
using System.IO; public class WebRequestUtility : MonoBehaviour
{
public static WebRequestUtility Instance; enum RequestType
{
TEXT_GET,
TEXTUREE_GET,
ASSETBUNDEL,
POST
} public void Get(string url,Action<UnityWebRequest> action)
{
StartCoroutine(Request(url,action,RequestType.TEXT_GET));
} public void GetTexture(string url,Action<UnityWebRequest> action)
{
StartCoroutine(Request(url, action, RequestType.TEXTUREE_GET));
} public void GetAssetBundle(string url,Action<UnityWebRequest> action)
{
StartCoroutine(Request(url, action, RequestType.ASSETBUNDEL));
} public void Post(string url, Action<UnityWebRequest> action, List<IMultipartFormSection> formData)
{
StartCoroutine(Request(url, action, RequestType.POST, formData));
} IEnumerator Request(string url,Action<UnityWebRequest> action,RequestType type, List<IMultipartFormSection> formData=null)
{
UnityWebRequest webRequest = null; switch (type)
{
case RequestType.TEXT_GET:
webRequest = UnityWebRequest.Get(url);
break;
case RequestType.TEXTUREE_GET:
webRequest = UnityWebRequestTexture.GetTexture(url);
break;
case RequestType.ASSETBUNDEL:
webRequest = UnityWebRequestAssetBundle.GetAssetBundle(url);
break;
case RequestType.POST:
webRequest = UnityWebRequest.Post(url, formData);
break;
default:
break;
} if(webRequest==null)
{
Debug.Log("WebRequest initialise error");
yield break;
} yield return webRequest.SendWebRequest(); action?.Invoke(webRequest); webRequest.Dispose();
webRequest = null;
Resources.UnloadUnusedAssets();
} private void Awake()
{
Instance = this;
}
}

调用Get方法

Get(texUrlGet, OnGetAction);

//OnGetAction回调

    void OnGetAction(UnityWebRequest webRequest)
{
if(webRequest.isHttpError || webRequest.isNetworkError)
{
Debug.Log("WebRequest error:"+webRequest.error);
return;
} //下载文本
Debug.Log(webRequest.downloadHandler.text); //下载图片
Texture2D t2d = new Texture2D(, );
t2d.LoadImage(webRequest.downloadHandler.data); rawImage.texture = t2d;
}

调用Get方法只获取图片

GetTexture(texUrlGet, OnGetTextueAction);

    void OnGetTextueAction(UnityWebRequest webRequest)
{
if (webRequest.isHttpError || webRequest.isNetworkError)
{
Debug.Log("WebRequest error:" + webRequest.error);
return;
} DownloadHandlerTexture texHandler = (DownloadHandlerTexture)webRequest.downloadHandler;
rawImage.texture = ((DownloadHandlerTexture)webRequest.downloadHandler).texture;
}

post方法

        string headPath = @"D:\zzh.png";
byte[] bytes = File.ReadAllBytes(headPath); List<IMultipartFormSection> formData = new List<IMultipartFormSection>();
formData.Add(new MultipartFormDataSection("api_key", "**********************"));
formData.Add(new MultipartFormDataSection("api_secret", "***************************"));
//formData.Add(new MultipartFormDataSection("image_url", texUrlGet));
formData.Add(new MultipartFormFileSection("image_file", bytes, "zzh.png", "application/octet-stream")); Post("https://api-cn.faceplusplus.com/facepp/v3/detect", OnPostAction, formData);
    void OnPostAction(UnityWebRequest webRequest)
{
if (webRequest.isHttpError || webRequest.isNetworkError)
{
Debug.Log("WebRequest error:" + webRequest.error);
return;
} //下载文本
Debug.Log(webRequest.downloadHandler.text);
}

//---------------------------------2018-1026------------------------------------------//更新

在post请求时根据需求分为四种模式,详细见https://www.cnblogs.com/llstart-new0201/p/6825058.html;所以此次更新增加了post模式,但新加的并未进行测试

using System.Collections;
using System;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
using System.Collections.Generic;
using System.IO; public class WebRequestUtility : MonoBehaviour
{
public RawImage rawImage; public static WebRequestUtility Instance; enum RequestType
{
TEXT_GET,
TEXTUREE_GET,
ASSETBUNDEL,
POST_FORM,
POST_URLENCODED,
POST_JSON,
POST_XML
} class PostContent
{
public WWWForm formData;
public string stringContent; public PostContent(WWWForm formData)
{
this.formData = formData;
} public PostContent(string text)
{
this.stringContent = text;
}
} public void Get(string url,Action<UnityWebRequest> action)
{
StartCoroutine(Request(url,action,RequestType.TEXT_GET));
} public void GetTexture(string url,Action<UnityWebRequest> action)
{
StartCoroutine(Request(url, action, RequestType.TEXTUREE_GET));
} public void GetAssetBundle(string url,Action<UnityWebRequest> action)
{
StartCoroutine(Request(url, action, RequestType.ASSETBUNDEL));
} public void Post(string url, Action<UnityWebRequest> action, WWWForm formData)
{
StartCoroutine(Request(url, action, RequestType.POST_FORM, new PostContent(formData)));
} public void PostUrlEncoded(string url,Action<UnityWebRequest> action,string json)
{
StartCoroutine(Request(url, action, RequestType.POST_URLENCODED,new PostContent(json)));
} public void PostJson(string url, Action<UnityWebRequest> action, string json)
{
StartCoroutine(Request(url, action, RequestType.POST_JSON, new PostContent(json)));
} public void PostXml(string url, Action<UnityWebRequest> action, string json)
{
StartCoroutine(Request(url, action, RequestType.POST_XML, new PostContent(json)));
} IEnumerator Request(string url,Action<UnityWebRequest> action,RequestType type, PostContent postContent =null)
{
UnityWebRequest webRequest = null; switch (type)
{
case RequestType.TEXT_GET:
webRequest = UnityWebRequest.Get(url);
break;
case RequestType.TEXTUREE_GET:
webRequest = UnityWebRequestTexture.GetTexture(url);
break;
case RequestType.ASSETBUNDEL:
webRequest = UnityWebRequestAssetBundle.GetAssetBundle(url);
break;
case RequestType.POST_FORM:
webRequest = UnityWebRequest.Post(url, postContent.formData);
break;
case RequestType.POST_URLENCODED:
webRequest = UnityWebRequest.Post(url, postContent.stringContent);
//可以不进行设置,此时默认为urlencoded
webRequest.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
break;
case RequestType.POST_JSON:
webRequest = UnityWebRequest.Post(url, postContent.stringContent);
webRequest.SetRequestHeader("Content-Type", "application/json");
break;
case RequestType.POST_XML:
webRequest = UnityWebRequest.Post(url, postContent.stringContent);
webRequest.SetRequestHeader("Content-Type", "text/xml");//注:text/plain为纯文本
break;
default:
break;
} if(webRequest==null)
{
Debug.Log("WebRequest initialise error");
yield break;
} yield return webRequest.SendWebRequest(); action?.Invoke(webRequest); action = null;
webRequest.Dispose();
webRequest = null;
Resources.UnloadUnusedAssets();
} private void Awake()
{
Instance = this;
}
}

鉴于post请求可能存在的问题,如https://www.jianshu.com/p/0f1f24829db3所述,做如下代码,

//通过PUT方式构造HTTP请求
byte[] myData = System.Text.Encoding.UTF8.GetBytes("This is some test data");
UnityWebRequest www = UnityWebRequest.Put("http://www.my-server.com/upload", myData); //构造好后,手动将请求方式更改为POST www.method = UnityWebRequest.kHttpVerbPOST; //常规的发送,接收操作 yield return www.Send();
if(www.isError) {
Debug.Log(www.error);
}
else {
Debug.Log("Upload complete!");
}

unityWebRequest  LLAPI

public IEnumerator PostUrl(string url, string postData)
{
using (UnityWebRequest www = new UnityWebRequest(url,"POST"))
{
byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(postData);
www.uploadHandler = (UploadHandler)new UploadHandlerRaw(postBytes);
www.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
www.SetRequestHeader("Content-Type", "application/json");
yield return www.Send();
if (www.isError)
{
Debug.Log(www.error);
}
else
{
// Show results as text
if (www.responseCode == )
{
Debug.Log(www.downloadHandler.text);
}
}
}
}

unityweb Request请求的更多相关文章

  1. springMVC中 request请求数据绑定到Controller入参 过程剖析

    前言:Controller方法的参数类型可以是基本类型,也可以是封装后的普通Java类型.若这个普通Java类型没有声明任何注解,则意味着它的每一个属性都需要到Request中去查找对应的请求参数.众 ...

  2. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  3. Java中request请求之 - 带文件上传的form表单

    常用系统开发中总免不了显示图片,保存一些文件资料等操作. 这些操作的背后,就是程序员最熟悉的 enctype="multipart/form-data"类型的表单. 说起file类 ...

  4. Servlet的学习之Request请求对象(3)

    本篇接上一篇,将Servlet中的HttpServletRequest对象获取RequestDispatcher对象后能进行的[转发]forward功能和[包含]include功能介绍完. 首先来看R ...

  5. Servlet的学习之Request请求对象(2)

    在上一篇<Servlet的学习(十)>中介绍了HttpServletRequest请求对象的一些常用方法,而从这篇起开始介绍和学习HttpServletRequest的常用功能. 使用Ht ...

  6. 关于微信小程序的Request请求错误处理

    在学微信小程序的request请求的时候,一开始报“不在以下合法域名列表中,请参考文”的错误,后来又莫名其妙的报“400 Bad Request”错误,经过半天的研究,终于搞定了,把遇到的错误给大家分 ...

  7. javaWeb中request请求转发和response重定向

    1.访问资源 运用forward方法只能重定向到同一个Web应用程序中的一个资源. 而sendRedirect方法可以让你重定向到任何URL.  2.request.get Forward代码中的&q ...

  8. 【安卓网络请求开源框架Volley源码解析系列】定制自己的Request请求及Volley框架源码剖析

    通过前面的学习我们已经掌握了Volley的基本用法,没看过的建议大家先去阅读我的博文[安卓网络请求开源框架Volley源码解析系列]初识Volley及其基本用法.如StringRequest用来请求一 ...

  9. PHP Request请求封装

    /** * Request请求封装 * Class Request * @package tool */ class Request { // curl 请求错误码 protected static ...

随机推荐

  1. selenium-05-常见问题

    一:日期控件 selenium不能直接对日期控件操作,可以通过js对日期控件做赋值操作 WebElement inputTimeBox=driver.findElement(by.name(" ...

  2. SpringBoot起飞系列-Web开发(四)

    一.前言 从今天你开始我们就开始进行我们的web开发,之前的一篇用SpringBoot起飞系列-使用idea搭建环境(二)已经说明了我们如何进行开发,当然这是搭建起步,接下来我们就开始进行详细的开发, ...

  3. Build step 'Invoke top-level Maven targets' marked build as failure Finished解决

    最近用法 jenkins部署maven项目时候,突然出现Build step 'Invoke top-level Maven targets' marked build as failure Fini ...

  4. layDate——初步使用

    layui系列中layDate的使用教程网址 https://www.layui.com/laydate/ 我这里简单举例: 1.引入js <script type="text/jav ...

  5. MySQL 分页查询优化

    有时在处理偏移量非常大的分页时候查询时,例如LIMIT 1000,10这样的查询,这时MySQL需要查询1010条记录然后只返回最后10条,前面1000条记录都被抛弃,这样的代价非常高.要优化这种查询 ...

  6. Java 基础篇之反射

    反射 使用反射获取程序运行时的对象和类的真实信息. 获取 Class 对象 每个类被加载之后,系统会为该类生成一个对应的 Class 对象,通过该 Class 对象可以访问到 JVM 中的这个类. 使 ...

  7. Mybatis基础知识点

    1. Mybatis框架优缺点 优点: 1. 易于上手和掌握. 2. sql写在xml里,便于统一管理和优化. 3. 解除sql与程序代码的耦合. 4. 提供映射标签,支持对象与数据库的orm字段关系 ...

  8. jobs后台任务

    前台作业:占据了命令提示符,就是你当前可以操作的作业后台作业:启动之后,释放命令提示符,后续的操作在后台完成 前台——>后台 ctrl+z:把正在前台的作业送往后台,这时作业的状态是暂停. CO ...

  9. 洛谷:P5072 [Ynoi2015]盼君勿忘

    原题地址:https://www.luogu.org/problem/P5072 题目简述 给定一个序列,每次查询一个区间[l,r]中所有子序列分别去重后的和mod p 思路 我们考虑每个数的贡献.即 ...

  10. 使用echarts画一个类似组织结构图的图表

    昨天,写了一篇关于圆环进度条的博客(请移步:Vue/React圆环进度条),已经烦不胜烦,今天又遇到了需要展示类似公司的组织结构图的功能需求,要冒了!!! 这种需求,自己用div+css也是可以实现的 ...