unity 发布web GL读取MySQL数据库,跨域问题已解决——小白版

更新问题

发现如果unity发布后的webGL,在网页端读取服务器的数据,会出现报错

Access to XMLHttpRequest at '服务器数据地址t' from origin '本机地址' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

这是由于浏览器的权限问题,造成的后果就是在unity 的编辑器下可以顺利运行,但是一旦发布,在网页上查询时,就后出现CORS权限错误,

这个权限问题的出现是请求的地址端口与数据地址端口不一致所造成,

有两种解决方法

第一种方法是最简单的,也是我现在采用的:将webgl的网页,与后台的数据放在一块,同地址,同端口(一定要同一端口,同一IP不同端口也是会报错的),这个问题就迎刃而解了。

第二种方法需要后台数据处理开发CORS权限,设定Access-Control-Allow-Origin=“你的IP”,这样也能够解决这个问题

------------------------------------------------------------------------------------------------------我是一条分割线---------------------------------------------------------------------------------------------------------------------------

工作需要,项目需要刷新读取sql数据,且unity需要发布webgl版本,但是unity在webgl的平台下无法支持直连MySql

所以想来很多的解决办法。

 socket连接,适用于多客户端,网上的资料大部分都是聊天室的,因此不予考虑。

在Java同事的帮助下,找到了正式的解决办法。

整个数据流如下:

unity——>javascript——>mysql

javaspcrit刷新读取sql数据,并以json的格式保存在页面上,unity用UnityWebRequest(WWW在2018版已弃用)读取json网页,获取下来的值,进行json解析,并赋值给dataset

json代码

[
    {"id":"37",
"rfid":null,
"material_id":"M000000001",
"type":"2",
"create_time":"2019-04-10 17:21:00",
"start_time":null,
"finish_time":null,
"is_start":"0",
"is_finish":"0",
"is_delete":"0",
},

    {"id":"38",
"rfid":null,
"material_id":"M000000002",
"type":"1",
"create_time":"2019-04-10 17:21:00",
"start_time":null,
"finish_time":null,
"is_start":"1",
"is_finish":"0",
"is_delete":"0",
}
]

unity UnityWebRequest访问代码

 string path = "http://192.168.1.100/Data.aspx";
    IEnumerator GetWebInfo()
    {
        UnityWebRequest webInfo = UnityWebRequest.Get(path);
            yield return webInfo.SendWebRequest();
        if (webInfo.isHttpError || webInfo.isNetworkError)
        {
            Debug.Log(webInfo.error);
            StopAllCoroutines();
            yield return null;
        }
        else
        {
            info = webInfo.downloadHandler.text;                     
            Debug.Log(webInfo.downloadHandler.text);
        }
    }

由于json数据是多层嵌套,所以用的是Newtonsoft来解析。引用using Newtonsoft.Json.Linq;

    public void InfoParsing() {

        //解析info
        JArray jar = JArray.Parse(info);
         Debug.Log(jar[jar.Count - 1]);
      
        //新建数据表的列名,与json值对应
        DataTable table = new DataTable("Info");
        DataColumnCollection columns = table.Columns;
        columns.Add("rfid", typeof(string));
        columns.Add("material_id", typeof(string));
        columns.Add("type", typeof(string));
        columns.Add("create_time", typeof(string));
        columns.Add("start_time", typeof(string));
        columns.Add("finish_time", typeof(string));
        columns.Add("is_start", typeof(string));
        columns.Add("is_finish", typeof(string));
        columns.Add("is_delete", typeof(string));

        //for循环依次解析{ …… }单元内容
        for (int i = 0; i < jar.Count; i++)
        {
            //解析每一个单元的值
            JObject obj = JObject.Parse(jar[i].ToString());
            Debug.Log(obj["material_id"]);
            
            //新建dataset行,并赋值
            DataRow infoRow = table.NewRow();
            infoRow["rfid"] = obj["rfid"];
            infoRow["material_id"] = obj["material_id"];
            infoRow["type"] = obj["type"];
            infoRow["create_time"] = obj["create_time"];
            infoRow["start_time"] = obj["start_time"];
            infoRow["finish_time"] = obj["finish_time"];
            infoRow["is_start"] = obj["is_start"];
            infoRow["is_finish"] = obj["is_finish"];
            infoRow["is_delete"] = obj["is_delete"];

            table.Rows.Add(infoRow);

        }
        //将存储完成的表Add到table中
        infoData.Tables.Add(table);
        Debug.Log(infoData.Tables["Info"].Rows.Count);

        Debug.Log(infoData.Tables["Info"].Rows[0][3]);

        WebText.text = infoData.Tables["Info"].Rows[0][3].ToString();
    }

至此,所有的值都在 infoData.Tables["Info"] 中,可以正常使用。

原文地址:https://www.cnblogs.com/Small-Transparent/p/11231193.html