UnityWebRequest GET-POST 简单封装
简单封装
·
1. 关键代码
1.1 协程实现
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
public class WebRequest : MonoBehaviour
{
/// <summary>
/// GET请求
/// </summary>
/// <param name="url">请求地址</param>
/// <param name="callback">请求完成回调</param>
public void Get(string url, Action<bool,string> callback)
{
StartCoroutine(CoroutineGetRequest(url, callback));
}
/// <summary>
/// POST请求
/// </summary>
/// <param name="url">请求地址</param>
/// <param name="postData">上传的数据</param>
/// <param name="requestHeader">请求头[application/json]</param>
/// <param name="callback">请求完成回调</param>
/// application/json
public void Post(string url, string postData,string requestHeader,Action<bool,string> callback)
{
StartCoroutine(CoroutinePostRequest(url, postData,requestHeader,callback));
}
IEnumerator CoroutineGetRequest(string url,Action<bool,string> callback)
{
// 使用UnityWebRequest发送一个GET请求
using UnityWebRequest request = UnityWebRequest.Get(url);
// 发送请求并等待结果
yield return request.SendWebRequest();
// 判断请求结果是否成功
if (request.result != UnityWebRequest.Result.Success)
{
// 请求不成功,通过回调函数返回失败状态和错误信息
callback?.Invoke(false, request.error);
}
else
{
// 获取响应消息
string responseMessage = request.downloadHandler.text;
// 调用回调函数并传入true和响应消息
callback?.Invoke(true, responseMessage);
}
}
IEnumerator CoroutinePostRequest(string url,string postData,string requestHeader,Action<bool,string> callback)
{
// 创建UnityWebRequest实例
using UnityWebRequest request = new UnityWebRequest(url, "POST");
// 将POST数据转换为字节数组
byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(postData);
// 设置上传处理程序为UploadHandlerRaw
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
// 设置下载处理程序为DownloadHandlerBuffer
request.downloadHandler = new DownloadHandlerBuffer();
// 设置请求头的Content-Type
request.SetRequestHeader("Content-Type", requestHeader);
// 发送请求并等待结果
yield return request.SendWebRequest();
// 判断请求结果是否成功
if (request.result != UnityWebRequest.Result.Success)
{
// 请求不成功,通过回调函数返回失败状态和错误信息
callback?.Invoke(false, request.error);
}
else
{
// 请求成功,通过回调函数返回成功状态和响应消息
string responseMessage = request.downloadHandler.text;
callback?.Invoke(true, responseMessage);
}
}
}
1.2 原生C#实现
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
public class WebRequest
{
#region 异步请求
/// <summary>
/// 异步GET请求
/// </summary>
/// <param name="url"></param>
/// <param name="requestComplete"></param>
/// <returns></returns>
public async void AsyncGet(string url, Action<bool, string> requestComplete)
{
var result =await AsyncGetRequest(url);
requestComplete?.Invoke(result.Item1, result.Item2);
}
/// <summary>
/// 异步POST请求
/// </summary>
/// <param name="url"></param>
/// <param name="postData"></param>
/// <param name="requestHeader"></param>
/// <param name="requestComplete"></param>
public async void AsyncPost(string url, string postData, string requestHeader, Action<bool, string> requestComplete)
{
var result = await AsyncPostRequest(url, postData, requestHeader);
requestComplete?.Invoke(result.Item1, result.Item2);
}
private static async Task<(bool, string)> AsyncGetRequest(string url)
{
var tcs = new TaskCompletionSource<(bool, string)>();
HttpClient client = new HttpClient();
try
{
// 发送GET请求获取响应
HttpResponseMessage response = await client.GetAsync(url);
// 如果响应成功
if (response.IsSuccessStatusCode)
{
// 读取响应体并设置结果为true和响应体
string responseBody = await response.Content.ReadAsStringAsync();
tcs.SetResult((true, responseBody));
}
// 如果响应失败
else
{
// 设置结果为false和响应原因
tcs.SetResult((false, response.ReasonPhrase));
}
}
// 捕获所有异常并设置结果为false和异常消息
catch (Exception ex)
{
tcs.SetResult((false, ex.Message));
}
// 不管是否发生异常,最后都释放 HttpClient 的资源
finally
{
client.Dispose();
}
// 返回异步任务的结果
return await tcs.Task;
}
private async Task<(bool, string)> AsyncPostRequest(string url, string postData, string requestHeader)
{
// 创建一个TaskCompletionSource对象,用于创建任务并设置任务结果
var tcs = new TaskCompletionSource<(bool, string)>();
// 创建一个HttpClient对象,用于发送HTTP请求
HttpClient client = new HttpClient();
try
{
// 创建一个StringContent对象,用于设置请求体内容和编码类型
StringContent content = new StringContent(postData, Encoding.UTF8, requestHeader);
// 向请求头添加一个自定义的请求头
client.DefaultRequestHeaders.Add("CustomHeader", requestHeader);
// 发送POST请求,并获取响应结果
HttpResponseMessage response = await client.PostAsync(url, content);
// 判断请求是否成功
if (response.IsSuccessStatusCode)
{
// 读取返回的内容
string responseBody = await response.Content.ReadAsStringAsync();
// 设置TaskCompletionSource对象的任务结果为成功,并传递返回的内容
tcs.SetResult((true, responseBody));
}
else
{
// 设置TaskCompletionSource对象的任务结果为失败,并传递错误信息
tcs.SetResult((false, response.ReasonPhrase));
}
}
catch (Exception ex)
{
// 发生异常时,设置TaskCompletionSource对象的任务结果为失败,并传递异常信息
tcs.SetResult((false, ex.Message));
}
finally
{
// 释放HttpClient对象的资源
client.Dispose();
}
// 返回异步任务的结果
return await tcs.Task;
}
#endregion
}
2. 示例代码
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
[SerializeField] private WebRequest webRequest;
private void Start()
{
GetData();
PostData();
}
void GetData()
{
webRequest.Get("https://api.52vmy.cn/api/wl/mingyan", (isComplete, message) =>
{
if (isComplete)
{
Debug.Log(message);
}
else
{
Debug.LogError(message);
}
});
}
void PostData()
{
Data postData = new Data()
{
word = "天"
};
string body = JsonUtility.ToJson(postData);
webRequest.Post($"https://api.pearktrue.cn/api/word/parse.php",body,"application/json", (isComplete,message) =>
{
if (isComplete)
{
Debug.Log(message);
}
else
{
Debug.LogError(message);
}
});
}
[System.Serializable]
private class Data
{
public string word;
}
}
更多推荐
所有评论(0)