Unity使用UnityWebRequest请求服务器json数据,webgl端服务器请求
根据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;// 就得到数据了
}
更多推荐
所有评论(0)