UnityWebRequest-与后台数据传输Get/Post请求

现在越来越多的项目都要用到登录、成绩上传等功能,涉及到Unity与后台接口之前调用与发送,下面着重介绍Unity自带的Http请求,包含Get/Post请求(表单、json、有头文件的请求。)

一、Get请求

直接填入接口地址,即可接收后台返回的json数据,新手在这里可能有点懵,不知道接口是什么意思,这里接口一般由后台开发人员直接给到你一个类似于“http://192.168.0.122/api/Test”这样的ip地址,这里如果后台给的接口地址正确,访问后通过Debug就能打印返回的数据,怎么解析json数据可以在以下我的博客中找到。Json文件解析,不管是从本地还是从服务器获取,都是解析string类型json数据。
在这里Get请求会讲的细一点,从本地与服务器两种方式去展示Get请求。

1、UnityWebRequest从本地读取

Unity自带的http请求还是挺人性化的,既可以从本地读取,也可以从服务器读取,这里测试就用最常见的Debug进行测试。

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

public class HttpTest : MonoBehaviour
{
    private string jsonUrl = "C:/Server.json";

    private void Start()
    {
        StartCoroutine(Get());
    }

    IEnumerator Get()
    {
        UnityWebRequest request = UnityWebRequest.Get(jsonUrl);
        yield return request.SendWebRequest();
        if(request.isHttpError || request.isNetworkError)
        {
            Debug.LogError(request.error);
        }
        else
        {
            string receiveContent = request.downloadHandler.text;
            Debug.Log(receiveContent);
        }
    }
}

这里我在C盘创建了一个Server.json文件,不过一般配置表直接放到StreamingAssets里面方便外部修改,并且各个平台都可以进行访问,大家在功能测试之后可以自己进行调式,贴上json数据内容与Debug内容。

{
	"serverUrl":"http://192.168.0.121:8090",
	"connectState":true,
	"numbers":
	[
		1,2,3,4,5,6,7,8,9,10
	]
}

UnityWebRequest-与后台数据传输Get/Post请求_第1张图片
此时已经可以正常接收json文件了,但是只接收数据并没有什么用,解析出来之后运用到项目中才是王道,下面进行json解析部分,Litjson.dll文件在我json解析博客中贴了链接,有需要的可以自己取。

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using LitJson;

public class HttpTest : MonoBehaviour
{
    private string jsonUrl = "C:/Server.json";

    private void Start()
    {
        StartCoroutine(Get());
    }

    IEnumerator Get()
    {
        UnityWebRequest request = UnityWebRequest.Get(jsonUrl);
        yield return request.SendWebRequest();
        if(request.isHttpError || request.isNetworkError)
        {
            Debug.LogError(request.error);
        }
        else
        {
            string receiveContent = request.downloadHandler.text;
            JsonInfo jsonInfo = JsonMapper.ToObject<JsonInfo>(receiveContent);
            Debug.Log(jsonInfo.serverUrl);
        }
    }

    public class JsonInfo
    {
        public string serverUrl;
        public bool connectState;
        public int[] numbers;
    }
}

解析之后打印jsonInfo.serverUrl,发现此时控制台报错,这是因为UnityWebRequest在接收本地json文件数据时多了4个字节,需要将数据转化成byte[]切割之后再转化位string,在这里有的小伙伴可能就纳闷了,这里直接用StreamReader它不香么,确实是,在PC端用StreamReader直接读取后没有这种多字节的情况,但是各位需要注意,Unity在WebGL端是不支持System.IO的,所以这个StreamReader用不了,大家如果只做PC端,直接用System.IO下面的就行,这里考虑到各个平台的通用性,使用UnityWeuRequest来进行数据解析。
在这里插入图片描述
直接贴代码

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using LitJson;
using System.Text;

public class HttpTest : MonoBehaviour
{
    private string jsonUrl = "C:/Server.json";

    private void Start()
    {
        StartCoroutine(Get());
    }

    IEnumerator Get()
    {
        UnityWebRequest request = UnityWebRequest.Get(jsonUrl);
        yield return request.SendWebRequest();
        if(request.isHttpError || request.isNetworkError)
        {
            Debug.LogError(request.error);
        }
        else
        {
            string receiveContent = request.downloadHandler.text;
            byte[] datas = Encoding.UTF8.GetBytes(receiveContent);
            receiveContent = Encoding.UTF8.GetString(datas, 3, datas.Length - 3);
            JsonInfo jsonInfo = JsonMapper.ToObject<JsonInfo>(receiveContent);
            Debug.Log(jsonInfo.serverUrl);
        }
    }

    public class JsonInfo
    {
        public string serverUrl;
        public bool connectState;
        public int[] numbers;
    }
}

此时发现serverUrl字段打印正常
在这里插入图片描述

2、UnityWebRequest从服务器读取

这里大家需要注意,UnityWebRequest不管是从本地还是从服务器,如果直接访问的.json的文件,它都要进行切割操作,具体原因应该是和api内部机制有关,不过一般情况下如果和后台进行对接数据传输,后台那边传过来的就是一串字符串,这时候也就不用去切割操作,直接解析就ok了。
这里我用IIS搭了一个简单服务器,感兴趣的小伙伴可以看下UnityWebGL搭建项目运行环境博客,这里面有讲到怎么搭建IIS服务器。
搭建好之后,把刚刚C盘的Server.json文件直接复制到服务器映射文件夹内,这里以我电脑的ip地址为例。
很简单,改一下jsonUrl字段就可以了,如果各位是从后台那边请求接口Get下来的数据,去掉这两行即可。

            byte[] datas = Encoding.UTF8.GetBytes(receiveContent);
            receiveContent = Encoding.UTF8.GetString(datas, 3, datas.Length - 3);
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
using LitJson;
using System.Text;

public class HttpTest : MonoBehaviour
{
    private string jsonUrl = "http://192.168.0.107/Server.json";

    private void Start()
    {
        StartCoroutine(Get());
    }

    IEnumerator Get()
    {
        UnityWebRequest request = UnityWebRequest.Get(jsonUrl);
        yield return request.SendWebRequest();
        if(request.isHttpError || request.isNetworkError)
        {
            Debug.LogError(request.error);
        }
        else
        {
            string receiveContent = request.downloadHandler.text;
            byte[] datas = Encoding.UTF8.GetBytes(receiveContent);
            receiveContent = Encoding.UTF8.GetString(datas, 3, datas.Length - 3);
            JsonInfo jsonInfo = JsonMapper.ToObject<JsonInfo>(receiveContent);
            Debug.Log(jsonInfo.serverUrl);
        }
    }

    public class JsonInfo
    {
        public string serverUrl;
        public bool connectState;
        public int[] numbers;
    }
}

二、Post请求

在了解上面Get请求之后,下面的Post请求就很容易理解,在正常情况下,Post请求需要通过json或者表单向后台发送数据,此时后台返回json字符串,直接解析即可,比如登录功能,Unity端有用户名和密码输入,通过表单发送后台所需要的字段对应的值,后台会返回登录结果,解析后通过结果进行用户名和密码验证。这里没有办法直观的去测试了,贴上代码的思路,大家可以让自己公司的后台给一个接口,测试一下即可,下面讲一下大体思路。
1、可以看到,postUrl就是后台开发人员提供的接口
2、userName/password:这俩哥们是后台那边接口定义的字段,这个字段的名称需要和后台那边定义的一模一样
3、WWWform:表单,通过上传表单字段对应的值,后台可以接收并返回信息
4、最后再和上面Get请求一样,用Litjson去解析接收的json字符串,就可以去实现某些功能

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

public class HttpTest : MonoBehaviour
{
    private string postUrl = "http://192.168.0.107/api/xxx";
    private const string userName = "userName";
    private const string password = "password";

    IEnumerator Post()
    {
        WWWForm form = new WWWForm();
        form.AddField(userName, "1");
        form.AddField(password, "123");

        UnityWebRequest request = UnityWebRequest.Post(postUrl, form);
        yield return request.SendWebRequest();
        if(request.isHttpError || request.isNetworkError)
        {
            Debug.LogError(request.error);
        }
        else
        {
            string receiveContent = request.downloadHandler.text;
            Debug.Log(receiveContent);
        }
    }
}

Unity简单的Get/Post请求到这里就结束了,后面我还会对http请求中的头文件、json文件、字典等数据上传做出介绍。

你可能感兴趣的:(Http请求,unity)