记录一下UnityWebRequest学习
UnityWebRequest对象用于与web服务器通信。
unitywebre任务处理与web服务器的HTTP通信流。其他对象——特别是下载处理程序和UploadHandler——分别管理下载和上传数据。
为方便起见,提供了一组静态函数;这些返回UnityWebRequest对象为许多常见用例正确配置。看: Get, Post, Put,
GetTexture.
注意:当UnityWebRequest通过调用Send方法开始与远程服务器通信时,不能改变UnityWebRequest对象上的大多数属性。
UnityWebRequest 架构
UnityWebRequest 由三个元素组成。
-
UploadHandler 处理数据 将数据发送到服务器 的对象
-
DownloadHandler 从服务器接收数据 的对象
-
UnityWebRequest 负责 HTTP 通信流量控制来管理上面两个对象的对象。
API翻译
静态变量
kHttpVerbCREATE | 字符串“CREATE”,通常用作HTTP CREATE request的动词。 |
---|---|
kHttpVerbDELETE | 字符串“DELETE”,通常用作HTTP DELETErequest的动词。 |
kHttpVerbGET | 字符串“GET”,通常用作HTTP GETrequest的动词。 |
kHttpVerbHEAD | 字符串“HEAD”,通常用作HTTP HEADrequest的动词。 |
kHttpVerbPOST | 字符串“POST”,通常用作HTTP POSTrequest的动词。 |
kHttpVerbPUT | 字符串“PUT”,通常用作HTTP PUTrequest的动词。 |
属性
certificateHandler | 持有对证书处理程序对象的引用,该对象负责管理UnityWebRequest的证书验证。 |
---|---|
chunkedTransfer | 表示UnityWebRequest系统是否应该采用HTTP/1.1传输编码方法。 |
disposeCertificateHandlerOnDispose | 如果为true,那么连接到UnityWebRequest的任何证书处理程序都将拥有证书处理程序。当UnityWebRequest时自动调用,处理。 |
disposeDownloadHandlerOnDispose | 如果为true,那么任何连接到这个UnityWebRequest的下载处理程序都将拥有DownloadHandler。当UnityWebRequest时自动调用。处理。 |
disposeUploadHandlerOnDispose | 如果为true,任何附加到这个UnityWebRequest的UploadHandler都将拥有UploadHandler。当UnityWebRequest时自动调用,处理。 |
downloadedBytes 返回系统从远程服务器下载的主体数据的字节数。(只读) | |
downloadHandler | 持有一个DownloadHandler对象的引用,该对象管理由这个UnityWebRequest从远程服务器接收的主体数据。 |
downloadProgress | 返回0.0到1.0之间的浮点值,指示从服务器下载数据的进度。(只读) |
error | 一种可读的字符串,描述了在处理HTTP请求或响应时,UnityWebRequest对象遇到的任何系统错误。(只读) |
isDone | 在UnityWebRequest完成与远程服务器的通信之后,返回true。(只读) |
isHttpError | 在这个UnityWebRequest收到一个表示错误的HTTP响应代码之后,返回true。(只读) |
isModifiable | 当UnityWebRequest的配置属性可以被改变时,返回true。(只读) |
isNetworkError | 在这个UnityWebRequest遇到系统错误后返回true。(只读) |
method | 定义这个UnityWebRequest使用的HTTP动词(就是上面的静态属性),如GET或POST。 |
redirectLimit | 在停止使用“重定向限制超过”系统错误之前,指示UnityWebRequest将遵循的重定向的数量。 |
responseCode | 服务器返回的数字HTTP响应代码,如200404或500。(只读) |
timeout | 设置UnityWebRequest在超时数秒后尝试中止。 |
uploadedBytes | 返回系统上载到远程服务器主体体数据字节数。(只读) |
uploadHandler | 持有对UploadHandler对象的引用,该对象管理将上传到远程服务器的主体数据。 |
uploadProgress | 返回0.0到1.0之间的浮点值,指示将数据上传至服务器的进度。 |
url | 定义UnityWebRequest与之通信的目标URL。 |
useHttpContinue | 确定这个UnityWebRequest是否包括Expect:100-继续在其传出的请求头中。(默认值:true)。 |
静态方法
Abort | 如果有进展,就尽快停止UnityWebRequest。 |
---|---|
Dispose | 这是一种信号,表明这个UnityWebRequest不再被使用,并且应该清理它所使用的任何资源。 |
GetRequestHeader | 检索定制请求头的值。 |
GetResponseHeader | 从收到的最新HTTP响应中检索响应头的值。 |
GetResponseHeaders | 在最新的HTTP响应中检索一个包含这个UnityWebRequest所接收到的所有响应头的字典。 |
SendWebRequest | 开始与远程服务器通信。在调用此方法之后,UnityWebRequest将执行DNS解析(如果必要的话),将HTTP请求发送到目标URL的远程服务器并处理服务器的响应。这种方法只能在任何给定的UnityWebRequest对象中调用一次。一旦这个方法被调用,您就不能更改UnityWebRequest的任何属性。这个方法返回一个WebRequestAsyncOperation对象。在一个coroutine中产生WebRequestAsyncOperation会导致coroutine暂停,直到UnityWebRequest遇到系统错误或完成通信。 |
SetRequestHeader | 设置一个HTTP请求头到一个定制值。 |
GET: 请求指定的页面信息,并返回实体主体。
HEAD: 只请求页面的首部。
POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。
PUT: 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE: 请求服务器删除指定的页面。
Get请求:
IEnumerator Get()
{
UnityWebRequest webRequest = UnityWebRequest.Get("http://www.baidu.com");
webRequest.timeout=10;
yield return webRequest.SendWebRequest();
if (webRequest.isHttpError||webRequest.isNetworkError)
Debug.Log(webRequest.error);
else
{
Debug.Log(webRequest.downloadHandler.text);
}
}
post请求
IEnumerator Post()
{
WWWForm form = new WWWForm();
//键值对
form.AddField("key", "value");
form.AddField("name","cha");
UnityWebRequest webRequest = UnityWebRequest.Post("http://www.baidu.com",form);
yield return webRequest.SendWebRequest();
if (webRequest.isHttpError||webRequest.isNetworkError)
Debug.Log(webRequest.error);
else
{
Debug.Log(webRequest.downloadHandler.text);
}
}
put请求
IEnumerator Upload()
{
byte[] myData = System.Text.Encoding.UTF8.GetBytes("123123");
UnityWebRequest webRequest = UnityWebRequest.Put("http://www.baidu.com",myData);
yield return uwr.SendWebRequest();
if (uwr.isNetworkError || uwr.isHttpError)
{
Debug.Log(uwr.error);
}
else
{
Debug.Log("上传成功!");
}
}
Head请求
IEnumerator SendRequest1()
{
UnityWebRequest uwr = UnityWebRequest.Head("http://www.chinar.xin/chinarweb/WebRequest/Get/00-效果.mp4"); //创建UnityWebRequest对象
yield return uwr.SendWebRequest(); //等待返回请求的信息
if (uwr.isHttpError || uwr.isNetworkError) //如果其 请求失败,或是 网络错误
{
Debug.Log(uwr.error); //打印错误原因
}
else //请求成功
{
Debug.Log("Head:请求成功");
}
}
GetResponseHeader方法
IEnumerator SendRequest1()
{
UnityWebRequest uwr = UnityWebRequest.Head("http://www.chinar.xin/chinarweb/WebRequest/Get/00-效果.mp4"); //创建UnityWebRequest对象
yield return uwr.SendWebRequest(); //等待返回请求的信息
if (uwr.isHttpError || uwr.isNetworkError) //如果其 请求失败,或是 网络错误
{
Debug.Log(uwr.error); //打印错误原因
}
else //请求成功
{
long totalLength = long.Parse(huwr.GetResponseHeader("Content-Length")); //首先拿到文件的全部长度
Debug.Log("totalLength");//打印文件长度
}
}
下载本地图片
System.Collections.IEnumerator ChangeImageCo()
{
using (uwr = UnityWebRequestTexture.GetTexture(GetFileLocation(customTextureFilename)))
{
yield return uwr.SendWedRequest();
if(uwr.isNetworkError||uwr.isHttpError)
{
Debug.Log(uwr.error);
}
else
{
Texture2D tex= DownloadHandlerTexture.GetContent(uwr);
}
}
}
下载本地音频(下载WAV格式)
IEnumerator MusicPlayer()
{
using (uwr = UnityWebRequestMultimedia.GetAudioClip(GetFileLocation(musicFile),AudioType.WAV))
{
yield return uwr.SendWebRequest();
if(uwr.isNetworkError||uwr.isHttpError)
{
Debug.Log(uwr.error);
}
else
{
AudioClip clip=DownloadHandlerAudioClip.GetContent(uwr);
}
}
}
下载AssetBundle
private IEnumerator Load()
{
string url = "";//此为AssetBundle资源路径,可为本地,也可以是服务端
UnityWebRequest request= UnityWebRequest.GetAssetBundle(url);
yield return request.SendWebRequest ();
if(uwr.isNetworkError||uwr.isHttpError)
{
Debug.Log(uwr.error);
}
else
{
AssetBundle ab = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;
}
}
下载文件 断点续传
例子来源:https://blog.csdn.net/linxinfa/article/details/94436027
using System;
using System.Collections;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
public class ChinarBreakpointRenewal : MonoBehaviour
{
private bool _isStop; //是否暂停
public Slider ProgressBar; //进度条
public Text SliderValue; //滑动条值
private Button startBtn; //开始按钮
private Button pauseBtn; //暂停按钮
public string Url = "http://www.linxinfa.test.mp4";
/// <summary>
/// 初始化UI界面及给按钮绑定方法
/// </summary>
void Start()
{
//初始化进度条和文本框
ProgressBar.value = 0;
SliderValue.text = "0.0%";
startBtn = GameObject.Find("Start Button").GetComponent<Button>();
startBtn.onClick.AddListener(OnClickStartDownload);
pauseBtn = GameObject.Find("Pause Button").GetComponent<Button>();
pauseBtn.onClick.AddListener(OnClickStop);
}
/// <summary>
/// 回调函数:开始下载
/// </summary>
public void OnClickStartDownload()
{
// 注意真机上要用Application.persistentDataPath
StartCoroutine(DownloadFile(Url, Application.streamingAssetsPath + "/MP4/test.mp4", CallBack));
}
/// <summary>
/// 协程:下载文件
/// </summary>
/// <param name="url">请求的Web地址</param>
/// <param name="filePath">文件保存路径</param>
/// <param name="callBack">下载完成的回调函数</param>
/// <returns></returns>
IEnumerator DownloadFile(string url, string filePath, Action callBack)
{
UnityWebRequest huwr = UnityWebRequest.Head(url); //Head方法可以获取到文件的全部长度
yield return huwr.SendWebRequest();
if (huwr.isNetworkError || huwr.isHttpError) //如果出错
{
Debug.Log(huwr.error); //输出 错误信息
}
else
{
long totalLength = long.Parse(huwr.GetResponseHeader("Content-Length")); //首先拿到文件的全部长度
string dirPath = Path.GetDirectoryName(filePath);
if (!Directory.Exists(dirPath)) //判断路径是否存在
{
Directory.CreateDirectory(dirPath);
}
//创建一个文件流,指定路径为filePath,模式为打开或创建,访问为写入
using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write))
{
long nowFileLength = fs.Length; //当前文件长度
Debug.Log(fs.Length);
if (nowFileLength < totalLength)
{
Debug.Log("还没下载完成");
fs.Seek(nowFileLength, SeekOrigin.Begin); //从头开始索引,长度为当前文件长度
UnityWebRequest uwr = UnityWebRequest.Get(url); //创建UnityWebRequest对象,将Url传入
uwr.SetRequestHeader("Range", "bytes=" + nowFileLength + "-" + totalLength);
uwr.SendWebRequest(); //开始请求
if (uwr.isNetworkError || uwr.isHttpError) //如果出错
{
Debug.Log(uwr.error); //输出 错误信息
}
else
{
long index = 0; //从该索引处继续下载
while (!uwr.isDone) //只要下载没有完成,一直执行此循环
{
if (_isStop) break;
yield return null;
byte[] data = uwr.downloadHandler.data;
if (data != null)
{
long length = data.Length - index;
fs.Write(data, (int) index, (int) length); //写入文件
index += length;
nowFileLength += length;
ProgressBar.value = (float) nowFileLength / totalLength;
SliderValue.text = Math.Floor((float) nowFileLength / totalLength * 100) + "%";
if (nowFileLength >= totalLength) //如果下载完成了
{
ProgressBar.value = 1; //改变Slider的值
SliderValue.text = 100 + "%";
callBack?.Invoke();
}
}
}
}
}
}
}
}
/// <summary>
/// 下载完成后的回调函数
/// </summary>
void CallBack()
{
Debug.Log("下载完成");
}
/// <summary>
/// 暂停下载
/// </summary>
public void OnClickStop()
{
if (_isStop)
{
pauseBtn.GetComponentInChildren<Text>().text = "暂停下载";
Debug.Log("继续下载");
_isStop = !_isStop;
OnClickStartDownload();
}
else
{
pauseBtn.GetComponentInChildren<Text>().text = "继续下载";
Debug.Log("暂停下载");
_isStop = !_isStop;
}
}
}