Unity与服务器进行对接Post,超详细介绍

2022-06-19 08:48:38

登录端:

一:获取账号/密码输入框(自己做个登录界面)

连这个获取UI,还不知道的,基础不稳,建议别着急学服务器

二:检测是否正确

1.先做个枚举判断是否连接成功

public enum NetWorkState02
{
    NETWORK_WARNING,//警告
    NETWORK_ERROE,//连接错误
    NETWORK_SUCCESS//连接成功
}

2.开始接后端,需要看后端发来的接口是怎么样的,再具体写。
现在我用的是我们后端发来的数据进行示范;
先写一个login类
自己做个UI,有账号输入框,密码输入框。

//---------------------------------------------------------------------------------------------// 2-1编号代码(开始)(按编号看)
 void Start()
{
 	button_Login.onClick.Add(Button_loginClick);//触发事件
}
 private void Button_loginClick()//检查账号密码
 {
 			string phone = 账号输入框.text;
            string psw = 密码输入框.text;
		//此时我们要告诉服务器,我们这个拿到了账号密码,要给服务器,
		//然后服务器告诉我们,账号密码对不对,
		//对了就会给我们反馈(包含数据,数据直接传给NetWorkCallBack_Login方法)//CallBack,会拿回来
		 WebRequest._ins.GetInfo_Login(phone, psw, NetWorkCallBack_Login);//先别继续往下看,先去3-1编号看(别看2-2)
}

//---------------------------------------------------------------------------------------------// 2-2编号代码
//这里获取的type是枚举的类型,无关痛痒
//注意这个json,这个就是我们写的委托,回调来的,服务器反馈的数据
private void NetWorkCallBack_Login(NetWorkState02 type, string json)
        {

            if (type != NetWorkState02.NETWORK_SUCCESS)
            {
                return;
            }
            else
            {
            	//先反序列化,把数据转化成能用的
            	<T>> data = JsonConvert.DeserializeObject<T>(json);//这个<T>,就是你自己写个类,例如学生类
                //TODO 可以拿数据了 data.name    data.sex   date.dress   等等等等等等等
            }
        }

//---------------------------------------------------------------------------------------------// 2-3编号代码

然后写一个WebRequest类,

//---------------------------------------------------------------------------------------------//3-1编号代码
 public static WebRequest _ins;

      readonly string form_data = "后端会给你这个路径";//如果没有表单,暂时可以不写
	readonly string raw = "后端会给你这个路径";//用来找到后端的数据的
	public readonly string url_login= "后端会给你这个路径";//登录按钮

 private void Awake()
    {
        _ins = this;
        DontDestroyOnLoad(this);
    }

   public void GetInfo_Login(string bindPhone, string password, Action<NetWorkState02, string> callBack)
    {
        Dictionary<string, object> dic = new Dictionary<string, object>//把账号密码设置成字典
        {
            { "bindPhone",bindPhone},
            { "password",password}
        };
        Dictionary<string, string> headers = SetHeader(raw);//加《写入请求头》的方法,用来查找你要找的数据,下面方法直接看
        //检查账号密码
        StartCoroutine(PostUrl(url_login, headers, dic, callBack));//去看3-2
    }
    private Dictionary<string, string> SetHeader(string ContentType)//这一步,按照官方的指示来
    {
    	Dictionary<string, string> headers = new Dictionary<string, string>()
           {
          { "Content-Type", ContentType },//新版舍弃了www,改用UnityWebRequest,看下图。
          };
        return headers;
	}

//---------------------------------------------------------------------------------------------//3-2编号代码   
 /// <summary>
    /// POST请求
    /// </summary>
    /// <param name="url">登录按钮路径(服务器给的路径)</param>
    /// <param name="dic">请求头(类似和服务器的交接暗号)</param>
    /// <param name="postDataDic">装有账号密码的字典 </param>
    /// <param name="callBack">成功时的回调函数</param>
    /// <returns></returns>
    public IEnumerator PostUrl(string url, Dictionary<string, string> dic, Dictionary<string, object> postDataDic, Action<NetWorkState02, string> callBack)
    {
        string type = dic["Content-Type"];
        string postData = "";
        if (form_data.Equals(type)) postData = GetStringFromDict(postDataDic);//把字典转换成表单,传给服务器
        //如果没有表单,那就把字典序列化,然后要传给服务器
        else if (raw.Equals(type)) postData = JsonConvert.SerializeObject(postDataDic);

        using (UnityWebRequest www = new UnityWebRequest(url, "POST"))
        {
            if (!String.IsNullOrEmpty(postData))
            {
                byte[] postBytes = Encoding.UTF8.GetBytes(postData);
                www.uploadHandler = (UploadHandler)new UploadHandlerRaw(postBytes);
            }
            www.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
            www.useHttpContinue = false;
            www.timeout = 30;
            foreach (var item in dic)
            {
                www.SetRequestHeader(item.Key, item.Value);
            }
            yield return www.SendWebRequest();
            long mark = 200;
            if (www.isNetworkError)//发起请求失败 -- 弹出异常
            {
                Debug.Log("www.isNetworkError:" + www.error);
                //("请求失败", "请求失败!\n在请求时发生了一个错误,\n请重试\n错误信息:" + www.error);
                callBack(NetWorkState02.NETWORK_ERROE, www.error);
            }
            else if (!mark.Equals(www.responseCode))//发起请求成功,但未能正确到达服务器
            {
                Debug.Log("warning:" + www.responseCode.ToString());
                //("请求失败", "请求异常!\n请重试.\n错误代码:" + www.responseCode);
                callBack(NetWorkState02.NETWORK_WARNING, www.responseCode.ToString());//warning
            }
            else if (mark.Equals(www.responseCode))//本次请求成功 - 服务器有返回数据
            {
                Debug.Log("success:" + www.downloadHandler.text.ToString());
                string json = www.downloadHandler.text;

                callBack(NetWorkState02.NETWORK_SUCCESS, json);//这个json就是返回的数据callBack,
                //去看2-2编码
            }
        }
    }
    /// <summary>
    /// 转换字典数据到表单
    /// </summary>
    /// <param name="data"></param>
    /// <returns></returns>
    private string GetStringFromDict(Dictionary<string, object> data)
    {
        StringBuilder builder = new StringBuilder();
        int i = 0;
        foreach (var item in data)
        {
            if (i > 0)
                builder.Append("&");
            builder.AppendFormat("{0}={1}", item.Key, item.Value);
            i++;
        }
        return builder.ToString();
    }

在这里插入图片描述

  • 作者:AT巡礼
  • 原文链接:https://blog.csdn.net/qq_42489774/article/details/110070752
    更新时间:2022-06-19 08:48:38