现在越来越多的项目都要用到登录、成绩上传等功能,涉及到Unity与后台接口之前调用与发送,下面着重介绍Unity自带的Http请求,包含Get/Post请求(表单、json、有头文件的请求。)
直接填入接口地址,即可接收后台返回的json数据,新手在这里可能有点懵,不知道接口是什么意思,这里接口一般由后台开发人员直接给到你一个类似于“http://192.168.0.122/api/Test”这样的ip地址,这里如果后台给的接口地址正确,访问后通过Debug就能打印返回的数据,怎么解析json数据可以在以下我的博客中找到。Json文件解析,不管是从本地还是从服务器获取,都是解析string类型json数据。
在这里Get请求会讲的细一点,从本地与服务器两种方式去展示Get请求。
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
]
}
此时已经可以正常接收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;
}
}
这里大家需要注意,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;
}
}
在了解上面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文件、字典等数据上传做出介绍。