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日
    浏览(42)
  • 对接微信支付接口

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

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

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

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

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

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

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

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

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

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

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

    2024年02月08日
    浏览(49)
  • MySQL和钉钉单据接口对接

    钉钉(DingTalk)是阿里巴巴集团打造的企业级智能移动办公平台,是数字经济时代的企业组织协同办公和应用开发平台。钉钉将IM即时沟通、钉钉文档、钉闪会、钉盘、Teambition、OA审批、智能人事、钉工牌、工作台深度整合,打造简单、高效、安全、智能的数字化未来工作方式

    2024年02月13日
    浏览(45)
  • 对接支付宝单笔转账接口

    转账到支付宝账户是为了满足支付宝商家向其他支付宝账户进行单笔转账的需求,针对具备开发能力的商家,提供通过 API 接口完成单笔转账的功能。可在支付宝 商家中心 产品中心 中开通 转账到支付宝账户 能力,在支付宝 商家中心 资金管理 中提交开通免费提额申请。 计

    2024年02月07日
    浏览(45)
  • 关于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日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包