目录
一、WWWForm是什么
WWWForm中,WWW代表网络的意思,Form的英文翻译是表单。
WWWForm是unity的一个格式,所以写完表格,也要用UnityWebRequest或WWW方式上传。但是WWW是unity提示过时的一个方式,我们就用UnityWebRequest来进行上传。
二、表单是什么
如果你在一个流程完备的工作岗位上呆过,或者去办过证件,比如银行卡、身份证等,他的流程都是:
1.你知道你要什么,例如要新办一张银行卡
2.银行会给你一张表,你开始填
3.银行审核表格,如果你写的对,就把东西给你
可以把任何一个网页理解成一个公司,如果你想获取点什么,就要自己拿一张表,在上面按照对方公司的要求写上你的需求,然后提交给网页,对方就会返回给你想要的东西。
表单,就是一张空的表格。
WWWForm,就是Unity自己写的一个类,在网络上比较通用的表格。
三、如何填表
既然知道是表格,那么我们接下来的任务就是填写表格。
1.创建一个表格
这个步骤很常规,就不细讲了。
WWWForm form = new WWWForm();
2.填写表格
正常我们填写银行的表格大致分几种类型:
a. 姓名:菌菌兹 (前面写类名,后面写个人信息)
b. 附件:证件照 (可能你还需要附上身份证之类的另外的文件)
同样,我们的WWWForm也分开填这种
//第一种,填写简单的信息
//表单,添加(用户名, 后面是真的用户名格式是string)
form.AddField("api_key", api_key);
//第二种,假如我要添加图片(就是比较长的信息,格式是byte)
//创建一个编码
Encoding encoding = Encoding.Default;
//获取图片 //自己写的方法,案例代码有
Texture2D texture2D = TextureToTexture2D(photo.texture);
//转换成byte格式
byte[] buffer = texture2D.EncodeToPNG();
form.AddBinaryData("image_file", buffer);
到此为止,表格就填完了。
四、发出表单
//发送需求
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.ProtocolError //通信时发生错误
|| request.result == UnityWebRequest.Result.ConnectionError //链接时发生错误
|| request.result == UnityWebRequest.Result.DataProcessingError) //数据传输时发生错误
{
Debug.Log(request.error);
}
else
{
//下载请求数据
string result = request.downloadHandler.text;
//Debug.Log(result);
}
备注:如果这里你对怎么错的不是很在意,你只想知道成功没有,还有一种写法。
//发送需求
yield return request.SendWebRequest();
//如果成功了
if (request.result == UnityWebRequest.Result.Success)
{
//下载请求数据
string result = request.downloadHandler.text;
//Debug.Log(result);
}
else //如果出错了,打印错误
{
Debug.LogError("错误: " + request.error);
}
五、案例代码
这个是连接face++API的案例代码
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
//解析Json用
[Serializable]
public class ResultData
{
public string request_id;
public int time_used;
public string result;
public Texture2D rtd;
}
public enum FaceType
{
chanel,//香奈儿
prague,//布拉格
old_dream,//旧梦
blossom,// 桃花
pink,// 粉黛
jiang_nan//江南
}
public class FaceAddTool : MonoBehaviour
{
//网址
string token_url = "https://api-cn.faceplusplus.com/facepp/v2/beautify";
//账户
string api_key = "申请的账户";
//密码
string api_secret = "申请的密码";
//滤镜
public FaceType faceType = FaceType.blossom;
public ResultData resultData;
public RawImage photo;
public int width;
public int height;
private void Start()
{
StartPost();
}
public void StartPost()
{
StartCoroutine(UnityWebRequestPost());
}
public string base64R;
IEnumerator UnityWebRequestPost()
{
WWWForm form = new WWWForm();
form.AddField("api_key", api_key);
form.AddField("api_secret", api_secret);
//获取图片
Texture2D texture2D = TextureToTexture2D(photo.texture);
//转换成byte格式
byte[] buffer = texture2D.EncodeToPNG();
form.AddBinaryData("image_file", buffer);
//form.AddField("filter_type", faceType.ToString());
//声明需求
UnityWebRequest request = UnityWebRequest.Post(token_url, form);
//发送需求
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.ProtocolError
|| request.result == UnityWebRequest.Result.ConnectionError
|| request.result == UnityWebRequest.Result.DataProcessingError)
{
Debug.Log(request.error);
}
else
{
//下载请求数据
string result = request.downloadHandler.text;
//Debug.Log(result);
resultData = JsonUtility.FromJson<ResultData>(result);
resultData.rtd = baseToTexture(resultData.result);
}
}
//Texture转Texture2D
private Texture2D TextureToTexture2D(Texture texture)
{
width = texture.width;
height = texture.height;
Texture2D texture2D = new Texture2D(texture.width, texture.height, TextureFormat.RGBA32, false);
RenderTexture currentRT = RenderTexture.active;
RenderTexture renderTexture = RenderTexture.GetTemporary(texture.width, texture.height, 32);
Graphics.Blit(texture, renderTexture);
RenderTexture.active = renderTexture;
texture2D.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
texture2D.Apply();
RenderTexture.active = currentRT;
RenderTexture.ReleaseTemporary(renderTexture);
return texture2D;
}
//base转Texture2D
public Texture2D baseToTexture(string base64)
{
byte[] bytes = Convert.FromBase64String(base64);
Texture2D tex2D = new Texture2D(width, height, TextureFormat.RGBA32, false);
tex2D.LoadImage(bytes);
return tex2D;
}
六、常见问题
1.头部信息
表单实际上传递的是内容信息,并不是头部信息。
备注:什么是头部信息
除了具体的内容外,有时候你需要另外附加一些备注。
例如:你点外卖时,内容是外卖,但是"外卖放门口",这就是备注。我们向网页请求有时也需要增加一些备注。
通常有:
方法: HTTP请求的方法,如GET、POST、PUT、DELETE等。
URI: 请求地址。
版本: HTTP协议版本,如HTTP/1.1。
头部字段: 其他常见信息
Host: 请求的主机名和端口号。
User-Agent: 发出请求的客户端类型和版本。
Accept: 客户接受的内容类型。
Content-Type: 内容类型
Content-Length: 内容长度,
Authorization: 凭据
Cookie: 存储在客户端的cookie信息。
Referer: 发起请求的页面的URL。
2.如何加入头部信息
我们以Azure的请求token服务为例,说明文档上内容为(如图1所示):

最后三行都是一对一对的,且前面有-H,-H就代表头部信息(Header),加入我们随便写一个表格以后需要加入这部分头部信息,写法为:
//在这写了表单
WWWForm form = new WWWForm();
UnityWebRequest request = UnityWebRequest.Post(token_url, form);
//如果你没有表单要发,你可以用另一个代码
UnityWebRequest request = UnityWebRequest.PostWwwForm(token_url,"");
//*****以上二选一*******************************************************
//在这里把之前要求的头部信息都加上
request.SetRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.SetRequestHeader("Content-length", "0");
request.SetRequestHeader("Ocp-Apim-Subscription-Key", speechKey);
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
Debug.Log("Token: " + request.downloadHandler.text);
}
else
{
Debug.LogError("Error: " + request.error);
}