Unity C# 网络学习—WWWForm

目录

一、WWWForm是什么

二、表单是什么

三、如何填表

1.创建一个表格

2.填写表格

四、发出表单

五、案例代码

六、常见问题

1.头部信息

2.如何加入头部信息 


一、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所示):

图1 Azure的说明文档

最后三行都是一对一对的,且前面有-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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菌菌巧乐兹

希望能给大家写更多有用的文章~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值