Unity使用UnityWebRequest请求服务器json数据,webgl端服务器请求

在Unity WebGL中,由于安全原因,不能直接使用.NET网络类进行网络连接。推荐使用UnityWebRequest或WWW类来请求服务器数据。本文介绍了如何在WebGL中使用UnityWebRequest发送POST请求获取JSON数据,并对返回数据进行解析。需要注意跨域访问时,服务器需使用CORS进行授权。
摘要由CSDN通过智能技术生成

根据unity官方说的,

WebGL 网络无法直接访问套接字

由于存在安全隐患,JavaScript 代码无法直接访问 IP 套接字来实现网络连接。因此,.NET 网络类(即 System.Net 命名空间中的所有内容,具体而言就是 System.Net.Sockets)在 WebGL 中不起作用。Unity 旧有的 UnityEngine.Network* 类也是如此,以 WebGL 为构建目标时无法使用这些类。

如果需要在 WebGL 中使用网络,当前可选择的做法是使用 Unity 中的 WWW 或 UnityWebRequest 类或使用支持 WebGL 的新型 Unity 网络功能,或者使用 JavaScript 中的 WebSockets 或 WebRTC 来实现您自己的网络。

使用 WebGL 中的 WWW 或 WebRequest 类

WebGL 支持 WWW 和 UnityWebRequest 类。这些类是使用 JavaScript 中的 XMLHttpRequest 类实现的(使用浏览器来处理 WWW 请求)。这种情况下对访问跨域资源施加了一些安全限制。基本上,任何 WWW 请求若是发送到与托管 WebGL 内容的服务器不同的服务器,都需要由您尝试访问的服务器进行授权。为了在 WebGL 中访问跨域 WWW 资源,您尝试访问的服务器需要使用 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.data的结构体是

public class RequestEmailLogin
{
    public string email;
    public string pwd;
    public RequestEmailLogin(string e, string p)
    {
        email = e;
        pwd = p;
    }
}

2.callback 是上面定义的UnityWebRequestHelp.OnNetBackWeb类型的委托

 UnityWebRequestHelp.Instance.SendPostData<SysMessage>(HttpCode.Email_Login, data, callback);

最后希望callback回来的数据解析成SysMessage类型的

void callback(object obj)

{

SysMessage a =  obj as SysMessage;// 就得到数据了

}

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UnityWebRequestUnity中用于HTTP通信的类。它可以用于从Web服务器下载数据,也可以用于向Web服务器上传数据UnityWebRequest 支持多种不同的数据类型,包括文本、图像、音频和视频等。它还支持各种不同的Web协议,包括HTTP、HTTPS和FTP等。 使用 UnityWebRequest,可以通过以下步骤进行HTTP通信: 1. 创建一个 UnityWebRequest 对象。 2. 设置 UnityWebRequest 对象的属性,例如URL、HTTP请求方法(GET、POST等)、Headers、上传数据等。 3. 发送 HTTP 请求。 4. 在接收到响应后,处理响应数据。可以根据需要将响应数据转换为文本、图像、音频或视频等。 以下是一个简单的示例,演示如何使用 UnityWebRequest 下载一个文本文件: ``` IEnumerator DownloadTextFile(string url) { UnityWebRequest www = UnityWebRequest.Get(url); yield return www.SendWebRequest(); if (www.result == UnityWebRequest.Result.Success) { string text = www.downloadHandler.text; Debug.Log("Downloaded text: " + text); } else { Debug.Log("Error downloading: " + www.error); } } ``` 在上面的示例中,我们首先创建了一个 UnityWebRequest 对象,并设置它的 URL。然后,我们使用 `yield return www.SendWebRequest()` 发送 HTTP 请求,并等待响应。在接收到响应后,我们检查 UnityWebRequest 的 `result` 属性,如果请求成功,我们获取响应数据并输出到控制台中。如果请求失败,我们输出错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值