unityweb Request请求
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请求的更多相关文章
- springMVC中 request请求数据绑定到Controller入参 过程剖析
前言:Controller方法的参数类型可以是基本类型,也可以是封装后的普通Java类型.若这个普通Java类型没有声明任何注解,则意味着它的每一个属性都需要到Request中去查找对应的请求参数.众 ...
- iOS开发之Socket通信实战--Request请求数据包编码模块
实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...
- Java中request请求之 - 带文件上传的form表单
常用系统开发中总免不了显示图片,保存一些文件资料等操作. 这些操作的背后,就是程序员最熟悉的 enctype="multipart/form-data"类型的表单. 说起file类 ...
- Servlet的学习之Request请求对象(3)
本篇接上一篇,将Servlet中的HttpServletRequest对象获取RequestDispatcher对象后能进行的[转发]forward功能和[包含]include功能介绍完. 首先来看R ...
- Servlet的学习之Request请求对象(2)
在上一篇<Servlet的学习(十)>中介绍了HttpServletRequest请求对象的一些常用方法,而从这篇起开始介绍和学习HttpServletRequest的常用功能. 使用Ht ...
- 关于微信小程序的Request请求错误处理
在学微信小程序的request请求的时候,一开始报“不在以下合法域名列表中,请参考文”的错误,后来又莫名其妙的报“400 Bad Request”错误,经过半天的研究,终于搞定了,把遇到的错误给大家分 ...
- javaWeb中request请求转发和response重定向
1.访问资源 运用forward方法只能重定向到同一个Web应用程序中的一个资源. 而sendRedirect方法可以让你重定向到任何URL. 2.request.get Forward代码中的&q ...
- 【安卓网络请求开源框架Volley源码解析系列】定制自己的Request请求及Volley框架源码剖析
通过前面的学习我们已经掌握了Volley的基本用法,没看过的建议大家先去阅读我的博文[安卓网络请求开源框架Volley源码解析系列]初识Volley及其基本用法.如StringRequest用来请求一 ...
- PHP Request请求封装
/** * Request请求封装 * Class Request * @package tool */ class Request { // curl 请求错误码 protected static ...
随机推荐
- Kafka系列二之部署与使用
Kafka部署与使用 写在前面 从上一篇Kafka的架构介绍和安装中,可能,你还一直很蒙,kafka到底该怎么使用呢?接下来,我们就来介绍Kafka的部署与使用.上篇文章中我们说到,Kafka的几个重 ...
- Redis数据库之数据基本管理操作
了解并掌握各种数据类型的命令操作方式,以及各种数据类型值的操作方式.同时,熟练记忆列表.哈希.集合和有序集合等数据类型的常用操作命令.能根据指令格式完成相应的指令操作. ①string数据类型的练习 ...
- Spring boot 官网学习笔记 - Using Spring Boot without the Parent POM,但是还要使用Parent POM提供的便利
If you do not want to use the spring-boot-starter-parent, you can still keep the benefit of the depe ...
- SkyWalking系列(一):初探
SkyWalking已经再微服务商城系列里使用了,本篇将介绍如何再Windows系统下安装并简单使用. 1.下载SkyWaling 本篇测试使用6.0版本:http://skywalking.apac ...
- python爬虫添加请求头和请求主体
添加头部信息有两种方法 1.通过添加urllib.request.Request中的headers参数 #先把要用到的信息放到一个字典中 headers = {} headers['User-Agen ...
- 浅谈Java的内存模型以及交互
本文的内存模型只写虚拟机内存模型,物理机的不予描述. Java内存模型 在Java中,虚拟机将运行时区域分成6中,如下图: 程序计数器:用来记录当前线程执行到哪一步操作.在多 ...
- 死磕 java线程系列之自己动手写一个线程池(续)
(手机横屏看源码更方便) 问题 (1)自己动手写的线程池如何支持带返回值的任务呢? (2)如果任务执行的过程中抛出异常了该怎么处理呢? 简介 上一章我们自己动手写了一个线程池,但是它是不支持带返回值的 ...
- 【Java】Java 单文件下载及重命名
代码(仅供参考): /* * 另存为 */ @RequestMapping("/saveAs.do") public @ResponseBody void saveAs(Strin ...
- 【WPF】EntityframeworkCore NLog出力设置
最近在用EFcore,由于不熟悉,经常出现一些异常都不知道如何排查,只能把EFcore的执行记录打印出来调查.确实简化了很多问题的调查. 官网提供了Asp.net Core与.net core 应用的 ...
- e课表项目第二次冲刺周期第十天
昨天完成了什么? 昨天还有一天第一次冲刺周期就结束了,我们的工作也接近尾声了,所以今天我利用之前的方法,完成了对监听的设置,以及对修改界面的编写,可以实现相应的删除和修改的功能,然后我和我们组的成员商 ...