Unity использует UnityWebRequest для запроса данных json сервера, запросов сервера webgl

По словам представителя единства,

Сеть WebGL не может напрямую обращаться к сокетам

Из соображений безопасности код JavaScript не может напрямую обращаться к IP-сокетам для сетевых подключений. Поэтому сетевые классы .NET (то есть  System.Net все в пространстве имен, в частности  System.Net.Sockets) не будут работать в WebGL. То же самое касается устаревших классов Unity  UnityEngine.Network* , которые нельзя использовать при ориентации на WebGL.

Если вам нужно использовать сеть в WebGL, вы можете использовать  классы WWW или  в Unity, использовать новые сетевые функции UnityUnityWebRequest  , поддерживающие WebGL  , или реализовать собственную сеть с помощью WebSockets или WebRTC в JavaScript.

Использование классов WWW или WebRequest в WebGL

WebGL поддерживает  классы WWW  и  UnityWebRequest  . XMLHttpRequest Эти классы реализованы с использованием классов в JavaScript  (с использованием браузера для обработки запросов WWW). Этот сценарий накладывает некоторые ограничения безопасности на доступ к ресурсам из разных источников. По сути, любой запрос WWW к серверу, отличному от того, на котором размещен контент WebGL, должен быть авторизован сервером, к которому вы пытаетесь получить доступ. Чтобы получить доступ к ресурсам WWW из разных источников в WebGL, сервер, к которому вы пытаетесь получить доступ, должен авторизовать этот доступ с помощью CORS.

верхний код

using LitJson;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
// TSingletonM是设置一个单例继承
public class UnityWebRequestHelp : TSingletonM<UnityWebRequestHelp>
{
    private string m_url = GameConfig.Url;
    public delegate void OnNetBackWeb(object eventObj);
    private void Awake()
    {
        Instance = this;
        // json解析的格式化添加
        LitJson.JsonMapper.RegisterImporter<long, int>((long input) => { return (int)input; });
        LitJson.JsonMapper.RegisterImporter<int, long>((int input) => { return (long)(input); });
    }
    public void SetUrl(string ip, int port)
    {
        m_url = @"http://" + ip + ":" + port;
    }

    /// 向服务器提交post请求

    public void SendPostData<T>(int cmd, object param, OnNetBackWeb actionResult)
    {
        UIManager.Instance.ShowLoading(true);
        RequestBaseData bas = new RequestBaseData();
        if (PropertyStatic.s_propUser.m_user.playerId != "")
        {
            bas.playerId = PropertyStatic.s_propUser.m_user.playerId;
            bas.sessionKey = PropertyStatic.s_propUser.m_sessionKey;
        }
        bas.setMessage(cmd, JsonMapper.ToJson(param));

        StartCoroutine(_Post<T>(JsonMapper.ToJson(bas), actionResult));

    }



    

    /// 向服务器提交post请求

    /// </summary>

    /// <param name="serverURL">服务器请求目标地址,like "http://www.my-server.com/myform"</param>

    /// <param name="lstformData">form表单参数</param>

    /// <param name="callback">处理返回结果的委托</param>

    /// <returns></returns>

    IEnumerator _Post<T>(string lstformData, OnNetBackWeb callback)

    {

        //List<IMultipartFormSection> formData = new List<IMultipartFormSection>();

        //formData.Add(new MultipartFormDataSection("field1=foo&field2=bar"));

        //formData.Add(new MultipartFormFileSection("my file data", "myfile.txt"));

        var request = new UnityWebRequest(m_url, "POST");
        byte[] bodyRaw = Encoding.UTF8.GetBytes(lstformData);
        request.uploadHandler = (UploadHandler)new UploadHandlerRaw(bodyRaw);
        request.SetRequestHeader("Content-Type", "application/json");

        DownloadHandler downloadHandler = new DownloadHandlerBuffer();
        request.downloadHandler = downloadHandler;

        request.timeout = 15;
        yield return request.SendWebRequest();

        if (request.downloadHandler.text == null|| request.downloadHandler.text == "")
        {
            UIManager.Instance.ShowLoading(false);
        }
        else
        {
            ResponseBaseData data = JsonMapper.ToObject<ResponseBaseData>(@request.downloadHandler.text);
            if (data.errorCode != 0)
            {

                string reason = "request error status: " + m_url + lstformData;
                Debug.LogError(reason);
                UIManager.Instance.ShowTips(data.errorCode.ToString());
            }
            else
            {
                if (data.sessionKey!="") PropertyStatic.s_propUser.m_sessionKey = data.sessionKey;

                if (data.sysMessage != null)
                {// 同步用户/心跳数据
                    if (callback != null) callback(data.sysMessage);
                }
                else
                {
                    // 格式化类型数据
                    T t = JsonMapper.ToObject<T>(data.message);
                    if (callback != null) callback(t);
                }
            }
            UIManager.Instance.ShowLoading(false);
        }


    }


}
[Serializable]
// 请求数据
public class RequestBaseData
{
    public int code;
    public int eId = 0;
    public int isCheck = 0;
    public string message;
    public string playerId;
    public int pwd = 0;
    public string sessionKey;
    public int version = 266;
    public void setMessage(int code1, string message1)
    {
        message = message1;
        code = code1;
    }
}


// 返回数据
[Serializable]
public class ResponseBaseData
{
    public string code { get; set; }
    public int errorCode { get; set; }
    public string execution { get; set; }
    public string message { get; set; }
    public SysMessage sysMessage { get; set; }
    public string time { get; set; }
    public string sessionKey { set; get; }//
}

Метод вызова, такой как вход по электронной почте 

1. Структура данных

общедоступный класс RequestEmailLogin
{     электронная почта общедоступной строки;     общедоступная строка pwd;     public RequestEmailLogin (строка e, строка p)     {         электронная почта = e;         рвд = р;     } }







2. обратный вызов является делегатом типа UnityWebRequestHelp.OnNetBackWeb, определенного выше.

 UnityWebRequestHelp.Instance.SendPostData<SysMessage>(HttpCode.Email_Login, данные, обратный вызов);

Наконец, я надеюсь, что данные, возвращаемые обратным вызовом, будут преобразованы в тип SysMessage.

недействительный обратный вызов (объект объект)

{

SysMessage a = obj as SysMessage;// получаем данные

}

Guess you like

Origin blog.csdn.net/github_38633141/article/details/123505987
Recommended