Unity Post 案例 -- 简单2步搞定

  由于我们需要用到协程 所有需要继承一下 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; 
}

 

Guess you like

Origin blog.csdn.net/qq_39162566/article/details/112288635