Unity 与后端通信,对接口

这篇具有很好参考价值的文章主要介绍了Unity 与后端通信,对接口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

UnityWebRequest与后端通信,对接口

注意:每个后端做的接口都会有些不同,根据实际更改。本文为案例。
本接口程序被设计用来支撑移动客户端部分功能,数据交换格式为JSON,接口若支持POST方式访问,则一般也支持GET方式访问(特殊情况除外,如:文件上传),最佳访问方式请参照各API定义中的建议。

提交数据方式

1、application/x-www-form-urlencoded
用于发送表单数据,数据会进行 URL 编码。
2、application/json
发送Json格式的数据。
3、multipart/form-data
用于发送带有文件上传的表单数据。
4、text/plain
发送纯文本数据

本文采用的是发送json格式数据。

_request.SetRequestHeader("Content-Type", "application/json;charset=utf-8");

安全性:

一般为了保证数据传输的完整和安全,不被篡改,都需要进行加密。
本文密钥:benwenmiyao (与后端确定的一段无规则字符串)
token和sign不进行再次加密。
本次传输的字符串都为小写。
签名规则

sign = sha1( (k1=v1&k2=v2...) + "secret=benwenmiyao" )

其中,k1 = v1&k2 = v2 …为参数键值列表,列表中的每一项格式为“键=值”,列表项需要根据键名升序排列,然后用“&”进行连接最后将数据传输秘钥secret拼接至尾端。整体作sha1运算得到最终的签名。

对所有参数按key按ASCⅡ码做升序排序,加密算法sha1。
比如入参是c=1&b=2&a=3,排序之后是a,b,c。把参数名和参数值连接成字符串,a=1&b=2&c=3,把secret连接到字符串的尾部:

a=1&b=2&c=3&secret=benwenmiyao

进行sha1加密。

sha1(“a=1&b=2&c=3&secret=benwenmiyao”)

加密
具体参考另一篇https://blog.csdn.net/weixin_44347839/article/details/134926493?spm=1001.2014.3001.5501

2个POST案例参考:
1、登录
请求体Body是字段moblie string类型 必填项,字段sign string类型 必填项。
2、获取好友列表
请求头header是字段token string类型 必填项(登录信息获取)。
实际代码参考

	//请求地址+端口
	public string UrlPath = "www.csdn.net";
	public string LoginUrl = "/Login";
	public string GetListUrl = "/GetList";
	//密钥
	private string secret="benwenmiyao";
	public string mobile = "181XXXXXXXX";
    //加密sign
	private string sign;
    // 登录成功返回得token
    private string token;
    public Dictionary<string, object> LoginDir(out string json)
    {
        Dictionary<string, object> dir = new Dictionary<string, object> {

            {"mobile" ,mobile}
        };
        json = dir.HandJsonFormat();
        return dir;
    }
    public Dictionary<string, object> LoginSignDir(out string json)
    {
        Dictionary<string, object> dir = new Dictionary<string, object> {

            {"mobile" ,mobile},
            { "sign",SortMessage(LoginDir(out string t))}
        };
        json = dir.HandJsonFormat();
        Debug.Log("mobile+sign" + json);
        return dir;
    }
    /// <summary>
    /// 对所有参数key按ASCⅡ码做升序排序 加密
    /// </summary>
    /// <returns></returns>
    public string SortMessage(Dictionary<string, object> dir)
    {
        string output = string.Join("&", dir.OrderBy(kv => kv.Key)
                                                     .Select(kv => $"{kv.Key}={kv.Value}"));
        output += ("&" + secret);
        var sha1 = EncryptTool.Sha1(output).ToLower();
        Debug.Log("未加密信息:" + output);
        Debug.Log("sha1加密信息:" + sha1);
        sign = sha1;
        return sha1;
    }
    /// <summary>
    /// Post
    /// </summary>
    /// <param name="path"></param>
    /// <param name="jsondata"></param>
    /// <param name="actionResult"></param>
    public IEnumerator Post(string path, string jsondata, Action<string> actionResult)
    {
        byte[] databyte = null;
        if (jsondata != null)
        {
            databyte = Encoding.UTF8.GetBytes(jsondata);
        }

        using (UnityWebRequest _request = new UnityWebRequest(path, UnityWebRequest.kHttpVerbPOST))
        {
            if (jsondata != null)
                _request.uploadHandler = new UploadHandlerRaw(databyte);
            _request.downloadHandler = new DownloadHandlerBuffer();
            _request.SetRequestHeader("Content-Type", "application/json;charset=utf-8");
            if (token != null)
            {
                Debug.Log("token:" + token);
                _request.SetRequestHeader("token", token);
            }
            _request.timeout = 60;
            UnityWebRequestAsyncOperation op = _request.SendWebRequest();
            yield return op;
            while (!op.isDone)
            {
                yield return null;
            }
            string result = "";
            if (op.webRequest.isHttpError || op.webRequest.isNetworkError)
            {
                Debug.Log("Get web resource failed: " + path);
                Debug.Log("ErrorCode: " + op.webRequest.responseCode+"  "+op.webRequest.error);
            }
            else
            {
                result = op.webRequest.downloadHandler.text;
            }
            result = Regex.Unescape(result);
            actionResult?.Invoke(result);
        }
    }
    public void PostLogin(){
    	LoginSignDir(out string loginSignPostMessage);
        StartCoroutine(Post(UrlPath + LoginUrl, loginSignPostMessage, g =>
        {
            Debug.Log(g);
            JObject obj = JObject.Parse(g);
            JToken _token = obj["data"]["token"];
            token = _token.ToString();
            Debug.Log("token:" + token);
        }));
    }
    public void GetListPost(){
        StartCoroutine(Post(UrlPath + GetListUrl, null, g =>
        {
            Debug.Log(g);
        }));
    }

HandJsonFormat 是把字典输出成json字符串格式。

        public static string HandJsonFormat(this Dictionary<string, object> source)
        {
            string json = "{";
            foreach (KeyValuePair<string, object> pair in source)
            {
                string key = pair.Key;
                object value = pair.Value;

                json += "\"" + key + "\":";
                if (value is string)
                {
                    json += "\"" + value + "\"";
                }
                else if (value is int || value is float || value is double || value is Int64)
                {
                    json += value.ToString();
                }
                else if (value is bool)
                {
                    json += ((bool)value) ? "true" : "false";
                }
                else
                {
                    throw new ArgumentException("Unsupported value type: " + value.GetType());
                }

                json += ",";
            }

            if (json.EndsWith(","))
            {
                json = json.Remove(json.Length - 1);
            }
            json += "}";

            return json;
        }

A Native Collection has not been disposed, resulting in a memoryleak. Enable Full StackTraces to get more details.

这里面有个坑,UnityWebRequest如果不用using块包住,不会自动调用方法释放,可能会导致报错内存泄漏的报错。
当然,你也可以在协程中自己手动释放。文章来源地址https://www.toymoban.com/news/detail-805725.html

到了这里,关于Unity 与后端通信,对接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • api接口如何有效对接

    在平时工作中,经常会遇到的一种场景是:A公司要对接B公司的API方法,这时,A公司就要阅读B公司的接口文档,从接口文档中找到自己需要对接的API,并根据接口文档的要求,完成编码工作,最终完成对接工作。 本篇是站在A公司的角度,去对接B公司API接口的实战。 一般情

    2024年02月16日
    浏览(28)
  • 对接微信支付接口

    https://pay.weixin.qq.com/wiki/doc/api/index.html 1.准备工作: 在微信上申请服务号类型的公众号,从公众号获取以下数据 appid:微信公众账号或开放平台APP的唯一标识 mch_id:商户号 (配置文件中的partner) partnerkey:商户密钥 2. 根据项目需求选择适合的支付方式,本例使用Native支付方式

    2024年02月13日
    浏览(43)
  • 电商API接口对接电子商务平台实现电商供应链一键对接

    按照商家的技术能力,可以为商家提供多种对接方案: 通过平台提供的API接口对ERP系统进行开发,实现和平台的对接,适用于有专业技术开发能力的商家; 平台统一开发服务系统,由平台人员实施商家ERP与平台的对接,适用于无专业的技术对接能力,有ERP系统且大批量信息

    2024年02月06日
    浏览(44)
  • Springboot 接口对接文件及对象

    两个sprongboot项目实现文件对接,在传入文件同时传递其他对象信息,比如接口如下 例如在D盘下创建1.txt,里边写入内容 界面输入传送方项目路径,比如:http://localhost:8082/send/sendFile 界面返回信息     接收方控制台输出

    2024年02月12日
    浏览(31)
  • 棋牌可对接的三方支付接口

    首先我们对第三方支付进行一个了解 所谓第三方支付 就是一些和产品所在国家以及国外各大银行签约 并具备一定实力和信誉保障的第三方独立机构提供的交易支持平台 在通过第三方支付平台的交易中 买方选购商品后,使用第三方平台提供的账户进行货款支付 由第三方通知

    2024年02月04日
    浏览(50)
  • Midjourney API 接口对接历程

    Midjourney是一个基于Discord环境的画图工具,它提供API接口用于扩展功能。对于程序开发者来说,Midjourney只能在Discord环境下使用,这限制了它的使用范围。本文将介绍使用Midjourney的API接口进行开发发过程中遇到的一些问题。 内测地址:由于不符合1万张门槛,登录被拒绝 无法

    2024年02月11日
    浏览(38)
  • Postman创建项目 对接口发起请求处理

    查看本文之前 您需要理解了解 Postman 的几个简单工作区 如果还没有掌握 可以先查看我的文章 简单认识 Postman界面操作 那么 掌握之后 我们就可以正式来开启我们的接口测试 我们先选择 Collections 我们点上面这个加号 多拉一个项目出来 然后 我们选我们刚加号点出来的项目 点

    2024年02月08日
    浏览(40)
  • 上交所FAST行情接口对接

    之前已完成了Binary行情的解析,接着便继续研究FAST(STEP)行情,但花费了将近一个月时间才终于搞定了。前面说过Binary格式的行情不太直观,所以对于初学者有点难度,接触FAST后才知道什么叫“完全看不明白”。还好互联网是伟大的,大佬们偶尔留下的只言片语对我们来说

    2024年01月18日
    浏览(43)
  • 钉钉和MySQL接口打通对接实战

    钉钉(DingTalk)是阿里巴巴集团专为中国企业打造的免费沟通和协同的多端平台,提供PC版,Web版和手机版,有考勤打卡、签到、审批、日志、公告、钉盘、钉邮等强大功能。 mysql是一个关系数据库管理系统(RDBMS),所谓的关系型数据库,是建立在关系模型基础上的数据库,

    2024年02月16日
    浏览(40)
  • 关于Vue前端接口对接的思考

    Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive. happy for hardess to solve denpendies. 需求: 1.vue 组件分类和获取数值的方式 在Vue中,组件可以分为以下几种类型: 全局组件(Global Components):全局组件是在

    2024年01月23日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包