Unity使用WWW类调用Restful接口

发表于2018-09-25
评论0 2k浏览
RESTful API是目前比较成熟的一套互联网应用程序的API设计理论。

1、简单的Get请求

基本http的GET请求需要在一个协程中new一个WWW类并传入准确的API地址,执行yield return www就会等待服务器的返回结果,之后才开始执行以后的代码。Get请求的API参数需要加入到API的地址中去,格式URL+?key1=value1&key2=value2。
public class NewBehaviourScript : MonoBehaviour {
    // Use this for initialization
    void Start () {
        StartCoroutine (IEHttpGet());
    }
    IEnumerator IEHttpGet()
    {
        //print ("get url " + fullUrl);
        WWW www = new WWW("http://127.0.0.1:6789/bmi");
        yield return www;
        if (www.error != null) {
            Debug.LogError (www.error);
        } 
        Debug.Log (www.text);
    }
}

2、简单的Post请求

这份代码使用的是JSON格式的数据。POST请求需要一个API地址,请求的HTTP头部需要加入头信息表明是json格式的数据,发送的josn数据格式化为字符串并转化为字节数据。这里使用的JSON解析库是MiniJSON。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using MiniJSON;
public class NewBehaviourScript : MonoBehaviour {
    // Use this for initialization
    void Start () {
        StartCoroutine (IEPost());
    }
    IEnumerator IEPost()
    {
        string fullUrl = "http://127.0.0.1:6789/bmi";
        //加入http 头信息
        Dictionary<string,string> JsonDic = new Dictionary<string,string> ();  
        JsonDic.Add ("Content-Type", "application/json");
        //请求的Json数据
        Dictionary<string,string> UserDic = new Dictionary<string, string> ();
        UserDic ["height"] = "170";
        UserDic ["weight"] = "62";
        string data = Json.Serialize (UserDic);
        //转换为字节
        byte[] post_data;  
        post_data = System.Text.UTF8Encoding.UTF8.GetBytes (data);  
        WWW www = new WWW (fullUrl, post_data, JsonDic);
        yield return www;
        if (www.error != null) {
            Debug.LogError ("error:" + www.error);
        } 
        Debug.Log (www.text);
    }
}

3、带安全验证的Get/Post请求

对于需要使用Base Auth安全验证的RESTful API,需要在http的请求信息中加入用户名称和用户帐号信息,并进行编码转化。

新建一个字典数据,加入编码说明和帐号信息。
Dictionary<string,string> AuthDic = new Dictionary<string,string> ();  // auth header
AuthDic.Add("Content-Type", "application/json");
string NameAndPw = "UserName" + ":" + "Password";
AuthDic.Add("Authorization", "Basic " + System.Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(NameAndPw)) );

完整的安全验证的POST请求
IEnumerator IEPost()
    {
        string fullUrl = "http://127.0.0.1:6789/bmi";
        Dictionary<string,string> AuthDic = new Dictionary<string,string> ();  // auth header
        AuthDic.Add("Content-Type", "application/json");
        string NameAndPw = "UserName" + ":" + "Password";
        AuthDic.Add("Authorization", "Basic " + System.Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(NameAndPw)) );
        //请求的Json数据
        Dictionary<string,string> UserDic = new Dictionary<string, string> ();
        UserDic ["height"] = "170";
        UserDic ["weight"] = "62";
        string data = Json.Serialize (UserDic);
        //转换为字节
        byte[] post_data;  
        post_data = System.Text.UTF8Encoding.UTF8.GetBytes (data);  
        WWW www = new WWW (fullUrl, post_data, AuthDic);
        yield return www;
        if (www.error != null) {
            Debug.LogError ("error:" + www.error);
        } 
        Debug.Log (www.text);
    }

4、封装成带回调函数的请求

对于多次的http请求,如果编写多份协程来处理会显得计较麻烦。这里把HTTP的请求封装成一个回调函数。得到服务器返回的数据则马上调用回调函数进行处理。

以下的http请求的的封装。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
/// <summary>
/// Http Request SDK 
/// </summary>
namespace RestHttpAPI
{
public class HttpAPI : MonoBehaviour {
        private static HttpAPI _instacne=null;
        private HttpAPI()
        {
        }
        public static HttpAPI Instance{
            get{
                if(_instacne == null )
                {
                    Debug.LogError("Awake error");
                }
                return _instacne ;
            }
        }
        void Awake () {
            DontDestroyOnLoad (gameObject);
            HttpAPI._instacne = gameObject.GetComponent<HttpAPI> ();   
            JsonDic.Add("Content-Type", "application/json");
            AuthDic.Add("Content-Type", "application/json");
            string NameAndPw = UserName + ":" + Password;
            AuthDic.Add("Authorization", "Basic " + System.Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(NameAndPw)) );
        }
        public string ipAdr="https://127.0.0.1:5000";
        public string ver = "";
        Dictionary<string,string> AuthDic = new Dictionary<string,string> ();  // auth header
        Dictionary<string,string> JsonDic = new Dictionary<string,string> ();  // json parser header
        public string UserName="";
        public string Password="";
        /// <summary>
        /// Get Method with callback
        /// </summary>
        /// <param name="url">URL.</param>
        /// <param name="callBack">Call back.</param>
        public void Get(string url,Action<string,string> callBack=null)
        {
            StartCoroutine ( IEHttpGet(this.ipAdr+url,callBack));
        }
        IEnumerator IEHttpGet(string fullUrl,Action<string,string> callBack)
        {
            //print ("get url " + fullUrl);
            WWW www = new WWW(fullUrl);
            yield return www;
            if (www.error != null) {
                Debug.LogError (www.error);
            } 
            if(callBack != null)
               callBack (www.text,www.error);
        }
        /// <summary>
        /// Get Method with callback and  BaseAuth
        /// </summary>
        /// <param name="url">URL.</param>
        /// <param name="callBack">Call back.</param>
        public void GetAuth(string url,Action<string,string> callBack=null)
        {
            StartCoroutine (IEGetAuth(url,callBack));
        }
        IEnumerator IEGetAuth(string url,Action<string,string> callBack=null)
        {
            string fullUrl = this.ipAdr + url;
            WWW www = new WWW(fullUrl,null,AuthDic);
            yield return www;
            if (www.error != null) {
                Debug.LogError ("error:"+www.error);
            } 
            if(callBack != null)
                callBack (www.text,www.error);
        }
        /// <summary>
        /// Post the specified url and callBack.
        /// </summary>
        /// <param name="url">URL.</param>
        /// <param name="callBack">Call back.</param>
        public void Post(string url,Action<string,string> callBack=null)
        {
            StartCoroutine (IEPost (url, callBack));
        }
        IEnumerator IEPost(string url,Action<string,string> callBack=null)
        {
            string fullUrl = this.ipAdr + url;
            WWWForm wf = new WWWForm ();
            wf.AddField ("K","v");
            WWW www = new WWW(fullUrl,wf);
            yield return www;
            if (www.error != null) {
                Debug.LogError ("error:"+www.error);
            }
            if(callBack != null)
                callBack (www.text,www.error);
        }
        /// <summary>
        /// Post the specified url, data and callBack.
        /// </summary>
        /// <param name="url">URL.</param>
        /// <param name="data">Data.</param>
        /// <param name="callBack">Call back.</param>
        public void Post(string url,string data, Action<string,string> callBack=null)
        {
            StartCoroutine (IEPost(url,data,callBack));
        }
        IEnumerator IEPost(string url,string data, Action<string,string> callBack=null)
        {
            string fullUrl = this.ipAdr + url;
            byte[] post_data;  
            post_data = System.Text.UTF8Encoding.UTF8.GetBytes(data);  
            WWW www = new WWW(fullUrl,post_data,JsonDic);
            yield return www;
            if (www.error != null) {
                Debug.LogError ("error:"+www.error);
            } 
            if(callBack != null)
                callBack (www.text,www.error);
        }
        /// <summary>
        /// Posts the auth.
        /// </summary>
        /// <param name="url">URL.</param>
        /// <param name="data">Data.</param>
        /// <param name="callBack">Call back.</param>
        public void PostAuth(string url,string data, Action<string,string> callBack=null)
        {
            StartCoroutine (IEPostAuth(url,data,callBack));
        }
        IEnumerator IEPostAuth(string url,string data, Action<string,string> callBack=null)
        {
            string fullUrl = this.ipAdr + url;
            byte[] post_data;  
            post_data = System.Text.UTF8Encoding.UTF8.GetBytes(data);  
            WWW www = new WWW(fullUrl,post_data,AuthDic);
            yield return www;
            if (www.error != null) {
                Debug.LogError ("error:"+www.error);
            }
            if(callBack != null)
                callBack (www.text,www.error);
        }
}
}

5、使用示例

基于以上的RestHttpAPI可以使用简单的代码调用RESTful API。
//设置API的网络地址  
HttpAPI.Instance.ipAdr="https://127.0.0.1:5000";  
HttpAPI.Instance.UserName="b";  
HttpAPI.Instance.Password="123";  
//普通的GetPOST请求  
HttpAPI.Instance.Get("/hello",(resp,error)=>{print(resp+""+error);});  
HttpAPI.Instance.Post("/hello",(resp,error)=>{print(resp+""+error);});  
//带安全验证的GET请求  
HttpAPI.Instance.GetAuth("/test",(resp,error)=>{print(resp+""+error);});  
//POST请求  
Dictionary<string,string>UserDic=newDictionary<string,string>();  
UserDic["username"]="you";  
UserDic["password"]="123";  
stringstr=Json.Serialize(UserDic);  
HttpAPI.Instance.Post("/user/newUser",str,(resp,error)=>{  
print(resp+""+error);}  
);  
//带安装验证的POST请求  
Dictionary<string,string>UserDic=newDictionary<string,string>();  
UserDic["appname"]="aote2";  
UserDic["channel"]="haha";  
UserDic["count"]="180";  
stringstr=Json.Serialize(UserDic);  
HttpAPI.Instance.PostAuth("/generateCode",str,(resp,error)=>{  
print(resp+""+error);}  
);  
来自:https://blog.csdn.net/shenzhan168/article/details/53229123

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引