unity里实现 GET POST PUT DELETE 请求服务器方法

34 篇文章 0 订阅

最近需要 独立开发一个项目 并且这个项目用到了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有三种方式 根据自己需要来调用 我是用的第三种

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值