由于我们需要用到协程 所有需要继承一下 MonoBehaviour
using System;
using System.Collections;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
public class HttpRequester : MonoBehaviour
{
const string KEY = "edeqw04fd311eb"; //加密用的KEY
const string IV = "5481231246531644";//加密用的IV
const string BaseURL = "https://www.baidu.com/";//默认请求地址
public delegate void PostResult(string jsonStr);//post返回回调
/// <summary>
/// Http Post
///
/// 案例:
///
///var deviceID = SystemInfo.deviceUniqueIdentifier;
/// JsonData data = new JsonData();
/// data["platform"] = 0;
/// data["app_id"] = 12;
/// data["device_id"] = deviceID;
///
/// var jsonStr = data.ToJson();
/// httpRequester.Post(jsonStr, "/g/user/login", (string resultJsonStr)=> {
/// LoginResult result = JsonUtility.FromJson<LoginResult>(resultJsonStr);
/// });
///
///
///
/// </summary>
/// <param name="jsonData">json对象字符串</param>
/// <param name="secondUrl">二段Url在baseURL基础新加偏移地址默认empty</param>
public void Post(string jsonData,string secondUrl = "", PostResult result = null)
{
IUtils.Log(">>>>>>>>>>>>>> Post: " + secondUrl);
StartCoroutine(PostData(BaseURL + secondUrl, jsonData,result));
}
/// <summary>
/// 协程处理
/// </summary>
/// <param name="url"></param>
/// <param name="jsonData"></param>
/// <param name="result"></param>
/// <returns></returns>
IEnumerator PostData(string url,string jsonData, PostResult result = null)
{
var encryptJson = HttpRequester.Encrypt(jsonData);
byte[] postBytes = Encoding.UTF8.GetBytes(encryptJson);
UnityWebRequest request = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST);
request.uploadHandler = (UploadHandler)new UploadHandlerRaw(postBytes);
request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
//Request Header传参
request.SetRequestHeader("Content-Type", "application/json;charset=utf-8");
request.SetRequestHeader("app_id", "4");
yield return request.SendWebRequest();
if (request.responseCode == 200)
{
var realContent = HttpRequester.Decipher(request.downloadHandler.text);
IUtils.Log(">>>>>>>>>>>>>> result content: " + realContent);
if (null != realContent)
result(realContent);
}
else
{
IUtils.Log("$$$$$$$$$$$$$$ post erro: " + request.responseCode);
}
}
/// <summary>
/// 解密
/// </summary>
/// <param name="content"></param>
/// <param name="key"></param>
/// <returns></returns>
public static string Decipher(string content, string key = null)
{
if (key == null)
{
key = KEY;
}
byte[] keyBytes = UTF8Encoding.UTF8.GetBytes(key);
byte[] ivArray = UTF8Encoding.UTF8.GetBytes(IV);
RijndaelManaged rm = new RijndaelManaged();
rm.Key = keyBytes;
rm.IV = ivArray;
rm.Mode = CipherMode.CBC;
rm.Padding = PaddingMode.PKCS7;
ICryptoTransform ict = rm.CreateDecryptor();
byte[] contentBytes = Convert.FromBase64String(content);
byte[] resultBytes = ict.TransformFinalBlock(contentBytes, 0, contentBytes.Length);
return UTF8Encoding.UTF8.GetString(resultBytes);
}
/// <summary>
/// 加密
/// </summary>
/// <param name="content"></param>
/// <param name="key"></param>
/// <returns></returns>
public static string Encrypt(string content, string key = null)
{
if (key == null)
{
key = KEY;
}
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
byte[] ivArray = UTF8Encoding.UTF8.GetBytes(IV);
byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(content);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.IV = ivArray;
rDel.Mode = CipherMode.CBC;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
}
请求调用
var deviceID = SystemInfo.deviceUniqueIdentifier;
JsonData data = new JsonData();
data["platform"] = 0;
data["app_id"] = 12;
data["device_id"] = deviceID;
var jsonStr = data.ToJson();
httpRequester.Post(jsonStr, "/g/user/login", (string resultJsonStr)=> {
// LoginResult 底下有介绍
LoginResult result = JsonUtility.FromJson<LoginResult>(resultJsonStr);
});
LoginResult 定义
[Serializable]
public class LoginResult {
public string nick;
public long coin;
public string time;
}