最近需要 独立开发一个项目 并且这个项目用到了GET POST PUT DELETE 这四种请求服务器方法,经过研究之后得出了下面代码
using Newtonsoft.Json.Linq;
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;
/// <summary>
/// unity的webrequest
/// </summary>
public class UnityHttpHelper : SingletonManager<UnityHttpHelper>
{
public const string Url = "http:xxxxxxxxxxxxxxxxxxx";
//把一个URL返回的内容 下载到一个path下面 保存成json文件
public void DownloadJsonRequest(string url, string path, Action<string> callback)
{
StartCoroutine(DownloadSceneJsonRequest(Url + url, path, callback));
}
IEnumerator DownloadSceneJsonRequest(string url, string path, Action<string> callback)
{
var uri = new Uri(Url + url);
var uwr = new UnityWebRequest(uri, UnityWebRequest.kHttpVerbGET)
{
downloadHandler = new DownloadHandlerFile(path)
};
yield return uwr.SendWebRequest();
if ((uwr.isHttpError || uwr.isNetworkError))
{
Debug.Log(uwr.error);
callback.Invoke(uwr.error);
}
else
{
if (uwr.responseCode == 200)//200表示接受成功
{
callback.Invoke(uwr.downloadHandler.text);
}
}
uwr.Dispose();
}
/// <summary>
/// get请求
/// </summary>
/// <param name="url"></param>
/// <param name="callback"></param>
public void GetUrlResponse(string url, Action<string> callback)
{
StartCoroutine(GetUrl(Url + url, callback));
}
/// <summary>
/// poset请求
/// </summary>
/// <param name="url"></param>
/// <param name="form"></param>
/// <param name="callback"></param>
public void PostUrlResponse(string url, WWWForm form, Action<string> callback)
{
StartCoroutine(PostUrl(Url + url, form, callback));
}
private IEnumerator GetUrl(string url, Action<string> callback)
{
//url = "http://thumpchi-ar.realibox.com/api/v1/nodes";
Debug.Log("下载地址" + url);
using (UnityWebRequest www = UnityWebRequest.Get(url))
{
//www.SetRequestHeader("session", StaticData.sessionid);
yield return www.SendWebRequest();
if ((www.isHttpError || www.isNetworkError))
{
Debug.Log(www.error);
Debug.Log(www.error);
callback.Invoke(www.error);
}
else
{
if (www.responseCode == 200)//200表示接受成功
{
callback.Invoke(www.downloadHandler.text);
}
}
}
}
private IEnumerator PostUrl(string url, WWWForm form, Action<string> getResult)
{
using (UnityWebRequest www = UnityWebRequest.Post(url, form))
{
yield return www.SendWebRequest();
if ((www.isHttpError || www.isNetworkError))
{
Debug.Log(www.error);
getResult.Invoke(www.error);
}
else
{
if (www.responseCode == 200)
{
//StaticData.sessionid = MidStrEx(www.GetResponseHeader("Set-Cookie"), "Path=/,session=", ";");
getResult(www.downloadHandler.text);
}
}
}
}
public void PostUrlResponse1(string url, string jsondata, Action<string> callback)
{
StartCoroutine(PostUrl1(Url + url, jsondata, callback));
}
private IEnumerator PostUrl1(string url, string jsondata, Action<string> getResult)
{
Debug.Log("请求地址" + url + jsondata);
//postParams是传参的对象,通过对json字符串用UTF8编码
//byte[] postBytes = Encoding.UTF8.GetBytes(jsondata);
//UnityWebRequest www = new UnityWebRequest(url, "POST");
//www.uploadHandler = new UploadHandlerRaw(postBytes);
//www.downloadHandler = new DownloadHandlerBuffer();
//设置Content - Type类型
//www.SetRequestHeader("Content-Type", "application/json;charset=utf-8");
//yield return www.SendWebRequest();
Byte[] formData = Encoding.UTF8.GetBytes(jsondata);
UnityWebRequest www = UnityWebRequest.Post(url, "");
www.uploadHandler = new UploadHandlerRaw(formData); //body
www.SetRequestHeader("Content-Type", "application/json;charset=utf-8");
www.timeout = 15;
yield return www.SendWebRequest();
//UnityWebRequest www = UnityWebRequest.Post(url, jsondata);
//www.SetRequestHeader("Content-Type", "application/json");
//yield return www.SendWebRequest();
if ((www.isHttpError || www.isNetworkError))
{
Debug.Log(www.error);
Debug.Log(www.downloadHandler.text);
getResult.Invoke(www.error);
}
else
{
if (www.responseCode == 200)
{
Debug.Log(www.downloadHandler.text);
getResult(www.downloadHandler.text);
}
}
}
public void PostUrlResponse(string url, string jsondata, Action<string> callback)
{
StartCoroutine(PostUrl(Url + url, jsondata, callback));
}
private IEnumerator PostUrl(string url, string jsondata, Action<string> getResult)
{
Debug.Log("=====jsonData " + jsondata);
UnityWebRequest www = UnityWebRequest.Post(url, jsondata);
www.SetRequestHeader("Content-Type", "application/json");
yield return www.SendWebRequest();
if ((www.isHttpError || www.isNetworkError))
{
Debug.Log(www.error);
getResult.Invoke(www.error);
}
else
{
if (www.responseCode == 200)
{
Debug.Log(www.downloadHandler.text);
getResult(www.downloadHandler.text);
}
}
}
/// <summary>
/// Put请求
/// </summary>
/// <param name="url"></param>
/// <param name="bodyData"></param>
/// <param name="OnCallback"></param>
public void PutRequest(string url, string bodyData, Action<string> OnCallback)
{
StartCoroutine(IePutRequest(Url + url, OnCallback, bodyData));
}
/// <summary>
/// Put请求(携程)
/// </summary>
/// <param name="url"></param>
/// <param name="bodyData"></param>
/// <returns></returns>
public IEnumerator IePutRequest(string url, Action<string> OnCallback, string bodyData)
{
Debug.Log(url + bodyData);
UnityWebRequest webRequest = UnityWebRequest.Put(url, bodyData);
webRequest.SetRequestHeader("Content-Type", "application/json");
yield return webRequest.SendWebRequest();
if (webRequest.isHttpError || webRequest.isNetworkError)
{
Debug.Log(webRequest.error);
OnCallback.Invoke(webRequest.error);
}
else
{
OnCallback(webRequest.downloadHandler.text);
}
}
public static string MidStrEx(string sourse, string startstr, string endstr)
{
string result = string.Empty;
int startindex, endindex;
try
{
startindex = sourse.IndexOf(startstr);
if (startindex == -1)
return result;
string tmpstr = sourse.Substring(startindex + startstr.Length);
endindex = tmpstr.IndexOf(endstr);
if (endindex == -1)
return result;
result = tmpstr.Remove(endindex);
}
catch (Exception ex)
{
Debug.Log("MidStrEx Err:" + ex.Message);
}
return result;
}
/// <summary>
/// Delete请求
/// </summary>
/// <param name="url"></param>
/// <param name="bodyData"></param>
/// <param name="OnCallback"></param>
public void DeleteRequest(string url, Action<string> OnCallback, Dictionary<string, string> Header = null)
{
StartCoroutine(IeDeleteRequest(Url + url, OnCallback, Header));
}
/// <summary>
/// Delete请求(携程)
/// </summary>
/// <returns></returns>
public IEnumerator IeDeleteRequest(string url, Action<string> OnCallback, Dictionary<string, string> Header)
{
Debug.Log(url);
UnityWebRequest webRequest = UnityWebRequest.Delete(url);
webRequest.SetRequestHeader("Content-Type", "application/json");
yield return webRequest.SendWebRequest();
if (webRequest.isHttpError || webRequest.isNetworkError)
{
Debug.Log(webRequest.error);
}
else
{
OnCallback("成功");
}
}
/// <summary>
/// Delete请求
/// </summary>
/// <param name="url"></param>
/// <param name="bodyData"></param>
/// <param name="OnCallback"></param>
public void DeleteRequest(string url, string jsondata, Action<string> OnCallback)
{
StartCoroutine(IeDeleteRequest(Url + url, jsondata, OnCallback));
}
public IEnumerator IeDeleteRequest(string url, string jsondata, Action<string> OnCallback)
{
Debug.Log(url);
Byte[] formData = Encoding.UTF8.GetBytes(jsondata);
UnityWebRequest www = UnityWebRequest.Delete(url);
www.uploadHandler = new UploadHandlerRaw(formData); //body
www.SetRequestHeader("Content-Type", "application/json;charset=utf-8");
www.timeout = 15;
yield return www.SendWebRequest();
if (www.isHttpError || www.isNetworkError)
{
Debug.Log(www.error);
}
else
{
OnCallback("成功");
}
}
}
继承mono的单例
public class SingletonManager<T> : MonoBehaviour where T : MonoBehaviour
{
private static T instance;
public static T Ins { get { return GetInstance(); } }
private static T GetInstance()
{
if (instance == null)
{
if ((T)FindObjectOfType(typeof(T)) != null)
{
instance = (T)FindObjectOfType(typeof(T));
}
else
{
GameObject go = new GameObject("" + typeof(T));
instance = go.AddComponent<T>();
DontDestroyOnLoad(instance);
}
}
return instance;
}
protected virtual void Awake()
{
instance = this as T;
}
protected virtual void OnDestroy()
{
instance = null;
}
}
调用方式
UnityHttpHelper.Ins.GetUrlResponse(api, LoadCar);
UnityHttpHelper.Ins.PostUrlResponse1(api, @Newtonsoft.Json.JsonConvert.SerializeObject(@form), Callback);
UnityHttpHelper.Ins.PutRequest(api+ $"/{需要修改的ID}", @Newtonsoft.Json.JsonConvert.SerializeObject(修改的内容), Callback);
UnityHttpHelper.Ins.DeleteRequest(url + $"/{需要删除的ID}", OnCallback);
其中 Post有三种方式 根据自己需要来调用 我是用的第三种