using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
namespace Framework {
class NetworkSystem : Singleton<NetworkSystem> {
private const string FORMAT_COMMAND = "{0}/{1}";
private const string FORMAT_ARG = "{0}?{1}";
private const string FORMAT_ARGS = "{0}={1}&";
/// <summary>
/// Http请求回调
/// </summary>
public static event Action<UnityWebRequest> OnHttpRequest;
/// <summary>
/// Http返回回调
/// </summary>
public static event Action<UnityWebRequest> OnHttpReturn;
/// <summary>
/// 请求Http Get
/// </summary>
/// <param name="url">地址</param>
/// <param name="callback">回调</param>
/// <param name="command">命令</param>
/// <param name="args">参数</param>
public static void RequestHttpGet (string url, Action<UnityWebRequest> callback, string command, params string[] args) {
RequestHttp (url, UnityWebRequest.kHttpVerbGET, callback, null, command, args);
}
/// <summary>
/// 请求HttpPost
/// </summary>
/// <param name="url">地址</param>
/// <param name="callback">回调</param>
/// <param name="data">数据</param>
/// <param name="command">命令</param>
/// <param name="args">参数</param>
public static void RequestHttpPost (string url, Action<UnityWebRequest> callback, string data, string command, params string[] args) {
RequestHttp (url, UnityWebRequest.kHttpVerbPOST, callback, data, command, args);
}
/// <summary>
/// URL编码
/// </summary>
/// <param name="str">字符串</param>
/// <returns></returns>
public static string ToUrlString (string str) {
return WWW.EscapeURL (str);
}
/// <summary>
/// Url 参数列表拼成字符串格式
/// </summary>
/// <param name="args">参数</param>
/// <returns></returns>
public static string ToUrlParams (params string[] args) {
//检查参数
if (args == null || args.Length <= 0) {
return "";
}
//遍历参数
string argStr = string.Empty;
for (int i = 0; i < args.Length; i += 2) {
if (i + 1 > args.Length) { break; }
string key = ToUrlString (args[i]);
string value = ToUrlString (args[i + 1]);
argStr += string.Format (FORMAT_ARGS, key, value);
}
argStr = argStr.Remove (argStr.Length - 1); // 删除最后的&
return argStr;
}
/// <summary>
/// 请求文件上传
/// </summary>
/// <param name="url">地址</param>
/// <param name="callback">回调</param>
/// <param name="command">命令</param>
/// <param name="data">数据</param>
/// <param name="info">信息</param>
/// <param name="args">参数</param>
public static void RequestWWWUpload (string url, Action<WWW, string> callback, string command, byte[] data, string info, params string[] args) {
if (!string.IsNullOrEmpty (command)) {
url = string.Format (FORMAT_COMMAND, url, command);
}
url = string.Format (FORMAT_ARG, url, ToUrlParams (args));
Core.Instance.StartCoroutine (WWWUpload (url, callback, info, data));
}
/// <summary>
/// www 上传文件
/// </summary>
/// <param name="url">地址</param>
/// <param name="callback">回调</param>
/// <param name="fileName">文件名</param>
/// <param name="data">数据</param>
/// <returns></returns>
private static IEnumerator WWWUpload (string url, Action<WWW, string> callback, string fileName, byte[] data) {
WWWForm form = new WWWForm ();
form.AddField ("type", "file");
form.AddBinaryData ("log_file", data, fileName);
WWW w = new WWW (url, form);
yield return w;
//回调
if (callback != null) {
callback.Invoke (w, w.text);
}
yield return null;
}
/// <summary>
/// Http请求
/// </summary>
/// <param name="url"></param>
/// <param name="method"></param>
/// <param name="callback"></param>
/// <param name="data"></param>
/// <param name="command"></param>
/// <param name="args"></param>
private static void RequestHttp (string url, string method, Action<UnityWebRequest> callback, string data, string command, params string[] args) {
if (!string.IsNullOrEmpty (command)) {
url = string.Format (FORMAT_COMMAND, url, command);
}
//参数整理
var urlParams = ToUrlParams (args);
if (!string.IsNullOrEmpty (urlParams)) {
url = string.Format (FORMAT_ARG, url, urlParams);
}
//提交协程处理
Core.Instance.StartCoroutine (HttpCoroutine (url, method, data, callback));
}
/// <summary>
/// Http协程
/// </summary>
/// <param name="url">地址</param>
/// <param name="method">方法</param>
/// <param name="data">数据</param>
/// <param name="callback">返回回调</param>
/// <returns>返回迭代器</returns>
private static IEnumerator HttpCoroutine (string url, string method, string data, Action<UnityWebRequest> callback) {
UnityWebRequest request = null;
if (method == UnityWebRequest.kHttpVerbPUT) {
request = UnityWebRequest.Put (url, data);
} else if (method == UnityWebRequest.kHttpVerbPOST) {
request = UnityWebRequest.Post (url, data);
} else {
request = UnityWebRequest.Get (url);
}
if (OnHttpRequest != null) {
OnHttpRequest.Invoke (request);
}
yield return request.SendWebRequest ();
try {
if (OnHttpReturn != null) {
OnHttpReturn.Invoke (request);
}
if (callback != null) {
callback.Invoke (request);
}
request.Dispose ();
} catch (Exception e) {
Debug.LogError ("http回调错误!" + url + " " + e.ToString ());
}
}
}
}