首页 > 其他分享 >UnityWebRequest-与后台数据传输Get/Post请求

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

时间:2023-04-07 09:33:34浏览次数:73  
标签:string Get request public json using Post UnityWebRequest

现在越来越多的项目都要用到登录、成绩上传等功能,涉及到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
	]
}

此时已经可以正常接收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文件、字典等数据上传做出介绍。

标签:string,Get,request,public,json,using,Post,UnityWebRequest
From: https://www.cnblogs.com/guangzhiruijie/p/17294937.html

相关文章

  • Dlg_GetNeighbourFaces ui 逻辑
    QGridLayout*gridLayout_3;QGroupBox*groupBox;QFormLayout*formLayoutformLayout->setWidget(1,QFormLayout::LabelRole,labelfillet);formLayout->setWidget(2,QFormLayout::SpanningRole,treeView);formLayout->setWidget(3,QFormLayout::LabelRole,......
  • DXImageTransform.Microsoft.AlphaImageLoader(滤镜实例)
    <html><head><scripttype="text/javascript">functionselectFile(oFile,imgname){if(oFile.value=="")return;varpos=oFile.value.lastIndexOf(".");varpos2=oFile.value.la......
  • vue3 watch 监听 flush post 作用?
    副作用刷新时机Vue的响应性系统会缓存副作用函数,并异步地刷新它们,这样可以避免同一个“tick”中多个状态改变导致的不必要的重复调用。同一个“tick”的意思是,Vue的内部机制会以最科学的计算规则将视图刷新请求合并成一个一个的"tick",每个“tick”刷新一次视图,比如a=1;b=2;只会......
  • NuGet Response status code does not indicate success: 401 (Unauthorized).
    Retrying'FindPackagesByIdAsyncCore'forsource'https://nexus-cn/repository/nuget-group/FindPackagesById()?id='Moq'&semVerLevel=2.0.0'.Anerroroccurredwhilesendingtherequest.Therequestwasaborted:Therequest......
  • PostgrepSQL常用操作小记
    pg_dump导入导出##导出#pg_dump-h<hostname>-p<port>-U<username>-s<database_name>><file_name>pg_dump-hlocalhost-p5432-Upostgres-smydatabase>mydatabase_schema.sql##导入#psql-h<hostname>-p<......
  • neondatabase 开源的k8s postgres autoscaling 工具
    autoscalingneondatabase开源的pg扩展工具(核心是解决neondatabase的一些问题),但是设计上有不少值得学习参考的地方参考架构  说明autoscaling设计上实现了自己的一个vm(支持在线迁移业务影响小),实现了自己的scheduler,也算是一个不错的k8s扩展开发参考项目参考资料......
  • C#Post请求
    C#发送Post请求(带参数)此处内容传输都是用UTF-8编码1.不带参数发送Post请求///<summary>///指定Post地址使用Get方式获取全部字符串///</summary>///<paramname="url">请求后台地址</param>///<returns></returns>p......
  • Postman报文进行加密之AES
    Postman自带的加密函数是cryptoJS能够实现AES+Base64加密,还是用到Postman中的Pre-requestScript。Pre-requestScript是指在发送报文前执行的脚本,用于对请求包中的各种参数做一些个性化的处理。接上篇文章,实际获取的sText签名需要传递给源报文参数sign,报文内容如下signText,把......
  • Flutter之GetX之路由管理
    GetX之路由管理GetX有一套完整的路由管理,并且不需要context上下文,API非常简洁直接导航导航到新的页面Get.to(NextScreen());返回,此方法可以用于关闭SnackBars、Dialogs、BottomSheets或任何你通常会用Navigator.pop(context)关闭的东西。Get.back();进入下一个页面并将上......
  • Flutter之GetX之GetConnect
    Flutter之GetX之GetConnectGetConnect可以便捷的通过http或websockets进行前后台通信。默认配置能轻松的通过extendGetConnect就能使用GET/POST/PUT/DELETE/SOCKET方法与RestAPI或websockets通信。classUserProviderextendsGetConnect{//GetrequestFuture<Respo......