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. 转载:alpha测试和beta测试的区别;黑盒测试和白盒测试的区别;

    alpha测试版,有点相当于内部测试,一般开发人员在场   ,是由用户做测试,但开发人员在场,一般是请用户到开发现场去测试 beta测试版,完全交给用户,由用户做测试,返回测试报告,相当于发行前的一个 ...

  2. Java 提取Word中的文本和图片

    本文将介绍通过Java来提取或读取Word文档中文本和图片的方法.这里提取文本和图片包括同时提取文档正文当中以及页眉.页脚中的的文本和图片. 使用工具:Free Spire.Doc for Java ...

  3. springboot WebMvcConfigurerAdapter替代

    过时应用: @Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter { @Override public vo ...

  4. Vue2.0+ElementUI实现表格翻页的实例

    参考地址: https://www.cnblogs.com/zhouyifeng/p/7706815.html

  5. Java 多线程练习

    题目:某公司组织年会,会议入场时有两个入口,在入场时每位员工都能获取一张双色球彩票,假设公司有100个员工,利用多线程模拟年会入场过程, 并分别统计每个入口入场的人数,以及每个员工拿到的彩票的号码.线 ...

  6. Docker系列(四):容器之间的网络通信

    首先我们需要知道:两个容器要能通信,必须要有属于同一个网络的网卡. 先来看下正常情况下我们的容器默认是否是能通信的,这里运行两个测试容器: docker run -it --name=bbox1 bu ...

  7. 使用gtest(googletest)进行c++单元测试

    这是系列文章的第三篇,前两篇https://www.cnblogs.com/gaopang/p/11243367.html和https://www.cnblogs.com/gaopang/p/1158 ...

  8. android 6.0导航栏 NavigationBar影响视图解决办法

    在开发app的时候会遇到有些测试手机没有物理按钮,比如最近在做的一个app在小米手机上运行显示效果很好,但是在华为P7手机上显示就乱了,底部的NavigationBar直接覆盖在主视图上,导致按钮无法 ...

  9. python urllib2实现http GET PUT DELETE POST的方法

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/3/11 下午8:33 # @Author : liubing # @File ...

  10. IT爱心求助站

    最近发生的一些事情,让我对自己的专业有了另外一层认识. 小尹同学,你是做软件的是吗?能否帮我看一下我的电脑问题? 老同学,我的电脑安装一个软件这么都装不上,能否帮我看一下呢? 邻居你好,我的手机怎么没 ...