SDK_UnityMoney/Assets/Script/SDKManager/Purchase/Server/RequestHandler.cs

113 lines
3.8 KiB
C#

#if UNITY_PURCHASE
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;
namespace WZ
{
public class RequestHandler : MonoBehaviour
{
private static RequestHandler _instance;
public static RequestHandler Instance
{
get
{
if (_instance != null) return _instance;
_instance = FindObjectOfType<RequestHandler>();
if (_instance != null) return _instance;
var obj = new GameObject();
_instance = obj.AddComponent<RequestHandler>();
return _instance;
}
}
private void Awake()
{
if (_instance == null)
{
_instance = this;
}
else if (_instance != this)
{
Destroy(gameObject);
}
DontDestroyOnLoad(gameObject);
}
public void SendPostRequest(string url, string jsonRequestBody, Dictionary<string, string> headers = null, Action<int, string> callback = null)
{
StartCoroutine(PostRequestCoroutine(url, jsonRequestBody, headers, callback));
}
private static IEnumerator PostRequestCoroutine(string url, string jsonRequestBody, Dictionary<string, string> headers, Action<int, string> callback)
{
using var request = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST);
request.timeout = 15;
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");
if (!string.IsNullOrEmpty(jsonRequestBody))
{
request.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(jsonRequestBody));
request.uploadHandler.contentType = "application/json";
}
if (headers != null)
{
foreach (var header in headers)
{
request.SetRequestHeader(header.Key, header.Value);
}
}
#if UNITY_EDITOR || DEVELOPMENT_BUILD
var startTime = Time.realtimeSinceStartup;
#endif
yield return request.SendWebRequest();
#if UNITY_EDITOR || DEVELOPMENT_BUILD
var endTime = Time.realtimeSinceStartup;
var sb = new StringBuilder();
sb.AppendLine($"POST Request URL: {url}");
sb.AppendLine($"POST Request Headers: {GetHeadersAsString(headers)}");
sb.AppendLine($"POST Request Body: {jsonRequestBody}");
sb.AppendLine($"Response Code: {request.responseCode}");
sb.AppendLine($"Response Time: {endTime - startTime:F2} seconds");
sb.AppendLine($"Response Headers: \n {GetHeadersAsString(request.GetResponseHeaders())}");
var downloadHandlerText = request.downloadHandler != null ? request.downloadHandler.text : "";
sb.AppendLine($"Response: {downloadHandlerText}");
#endif
if (request.result == UnityWebRequest.Result.Success)
{
callback?.Invoke(0, request.downloadHandler?.text);
}
else
{
callback?.Invoke(-1, request.error ?? $"request fail, result = {request.result}");
}
request.disposeDownloadHandlerOnDispose = true;
request.disposeUploadHandlerOnDispose = true;
}
private static string GetHeadersAsString(Dictionary<string, string> headers)
{
if (headers == null || headers.Count == 0)
{
return "\tN/A";
}
return headers.Aggregate("", (current, header) => current + "\t" + header.Key + ": " + header.Value + "\n");
}
}
}
#endif