UnityWebRequest-与后台数据传输Get/Post请求
一、Get请求
1、UnityWebRequest从本地读取
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;
}
}
此时发现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文件、字典等数据上传做出介绍。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!