NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Net/Utils/HttpHelper.cs

193 lines
6.2 KiB
C#
Raw Normal View History

2025-03-17 16:45:13 +08:00
using Cysharp.Threading.Tasks;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
public static class HttpHelper
{
/// <summary>
/// 异步发送HTTP POST请求到指定的URL包含JSON数据和自定义头部。
/// </summary>
/// <param name="url">POST请求的目标URL。</param>
/// <param name="data">要序列化为JSON并在请求体中发送的对象(传入后会进行自动序列化)。</param>
/// <param name="headers">包含要在请求中包含的自定义HTTP头部的字典请使用PostHeader类的方法。</param>
/// <returns>包含响应状态和消息的WebRequestResult。</returns>
/// <remarks>
/// 该方法将数据对象序列化为JSON通过UnityWebRequest发送并处理成功和失败的响应。
/// </remarks>
public static async UniTask<WebRequestResult> PostAsync(string url, object data, Dictionary<string, string> headers)
{
2025-03-17 17:27:39 +08:00
byte[] bytes = null;
if (data != null)
{
var jsonData = JsonUtility.ToJson(data);
bytes = Encoding.UTF8.GetBytes(jsonData);
}
2025-03-17 16:45:13 +08:00
UnityWebRequest www = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST)
{
2025-03-17 17:27:39 +08:00
uploadHandler = bytes != null ? new UploadHandlerRaw(bytes) : null,
2025-03-17 16:45:13 +08:00
downloadHandler = new DownloadHandlerBuffer(),
};
foreach (var header in headers)
{
www.SetRequestHeader(header.Key, header.Value);
}
try
{
await www.SendWebRequest();
if (www.result != UnityWebRequest.Result.Success)
{
DebugUtil.LogError(www.downloadHandler.text);
return new WebRequestResult { code = -1, message = www.downloadHandler.text };
}
else
{
DebugUtil.Log("Http请求成功,返回结果" + www.downloadHandler.text);
return new WebRequestResult { code = 0, message = www.downloadHandler.text };
}
}
catch (UnityWebRequestException e)
{
DebugUtil.LogError(e);
2025-03-17 19:04:58 +08:00
return new WebRequestResult { code = -1, message = e.Message };
2025-03-17 16:45:13 +08:00
}
}
2025-03-17 19:04:58 +08:00
public static async UniTask<WebRequestResult> GetAsync(string url, Dictionary<string, string> headers)
{
UnityWebRequest www = new UnityWebRequest(url, UnityWebRequest.kHttpVerbGET)
{
downloadHandler = new DownloadHandlerBuffer(),
};
foreach (var header in headers)
{
www.SetRequestHeader(header.Key, header.Value);
}
try
{
await www.SendWebRequest();
if (www.result != UnityWebRequest.Result.Success)
{
DebugUtil.LogError(www.downloadHandler.text);
return new WebRequestResult { code = -1, message = www.downloadHandler.text };
}
else
{
DebugUtil.Log("Http请求成功,返回结果" + www.downloadHandler.text);
return new WebRequestResult { code = 0, message = www.downloadHandler.text };
}
}
catch (UnityWebRequestException e)
{
DebugUtil.LogError(e);
return new WebRequestResult { code = -1, message = e.Message };
}
}
}
2025-03-17 16:45:13 +08:00
public class WebRequestResult
{
/// <summary>
/// 结果码
/// </summary>
public int code;
/// <summary>
/// downloadHandler的text内容
/// </summary>
public string message;
}
/// <summary>
/// 头部加密
/// </summary>
public partial class PostHeader
{
/// <summary>
/// 头部加密信息
/// </summary>
/// <param name="param"></param>
/// <returns></returns>
public static Dictionary<string, string> PostHeaderInfo(Dictionary<string, string> param)
{
DateTimeOffset now = DateTimeOffset.UtcNow;
string timeStamp = now.ToUnixTimeSeconds().ToString();
var encodeData = new EncodeData(param);
string encodeStr = encodeData.GetEncodeData();
var md5 = EncodeData.GetMd5Hash(encodeStr);
string linkStr = md5 + key;
string sign = EncodeData.GetSha256Hash(linkStr);
Dictionary<string, string> header = new();
header["signature"] = sign;
header["accessKey"] = accessKey;
header["timestamp"] = timeStamp;
header["Content-Type"] = "application/json;charset=utf-8";
return header;
}
class EncodeData
{
Dictionary<string, string> data = new Dictionary<string, string>();
public EncodeData(Dictionary<string, string> data)
{
this.data = data;
}
public string GetEncodeData()
{
List<string> key = data.Keys.Where(k => k != "signature").ToList();
key.Sort();
List<string> keyValuePairs = key.Select(k => k + "=" + data[k]).ToList();
string concatenate = string.Join("&", keyValuePairs);
//DebugUtil.Log("排序结果:" + concatenate);
return concatenate;
}
public static string GetMd5Hash(string input)
{
using (MD5 md5 = MD5.Create())
{
byte[] inputBytes = Encoding.UTF8.GetBytes(input);
byte[] hashBytes = md5.ComputeHash(inputBytes);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
{
sb.Append(hashBytes[i].ToString("x2"));
}
return sb.ToString();
}
}
public static string GetSha256Hash(string input)
{
using (SHA256 sha256 = SHA256.Create())
{
byte[] inputBytes = Encoding.UTF8.GetBytes(input);
byte[] hashBytes = sha256.ComputeHash(inputBytes);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
{
sb.Append(hashBytes[i].ToString("x2"));
}
return sb.ToString();
}
}
}
}