Unity WWW使用方法

概念

WWW基于HTTP协议,我们可以用它来发送HTTP请求。
一般来说,请求有两种方式:

  1. Get请求
  2. Post请求

请求类型

Get 请求

Get请求,会将数据携带在url中,而且最多只能传递1024个字节。
假设我们要向指定的 url:http://dict.youdao.com/suggest发送

  • user(账号) = 123
  • pwd(密码) = 456
    那么使用起来是这样的:
 要发送的url:"http://dict.youdao.com/suggest";
 携带数据后的url:"http://dict.youdao.com/suggest?user=123&pwd=456"
 WWW www = new WWW(url) 

可以看到数据是包裹在url中,不是挺安全

Post请求

Post请求,数据可以用WWWFrom(类似字典键值对)携带,也可以转成二进制流。这样数据不会携带在url中,更安全,而且没有数据长度限制。
使用起来大概是这样的

  	WWWForm wwwForm = new WWWForm();
    wwwForm.AddField("user","123");
    wwwForm.AddField("pwd","456");
    WWW www = new WWW(url,wwwForm);

实际使用

前面讲了概念,接下来我们来具体使用一下。

要实现的功能

我在网上找了一个可以查询单词的API,链接在这里,接下来我们用它来查 heart 这个单词。

  • url = “http://dict.youdao.com/suggest”
    参数:
  • q = 要查的单词;
  • doctype = 要返回的格式,默认是xml;

Get请求

    IEnumerator WWW_Get()
    {
    
    
        string url = "http://dict.youdao.com/suggest";
        string contentFormat = "?q={0}&doctype=json";
        string word = "heart";
        //拼接好最后的url
        string finalStr = url + string.Format(contentFormat, word);
        WWW www = new WWW(finalStr);
        yield return www;
        //如果error是空的,说明访问成功
        if (string.IsNullOrEmpty(www.error))
        {
    
    
            Debug.LogWarning($"success,content:{
      
      www.text}");
        }
        else
        {
    
    
            Debug.LogWarning($"failed,msg:{
      
      www.error}");
        }
    }

请求结果

success,content:{
    
    "result":{
    
    "msg":"success","code":200},"data":{
    
    "entries":[{
    
    "explain":"n. 心脏;感情;勇气;心形;要点; vt. 鼓励;铭记; vi. 结心; n. (Heart)人名...","entry":"heart"},{
    
    "explain":"adj. 衷心的;真诚的;真心真意的","entry":"heartfelt"},{
    
    "explain":"n. 灶台;炉边;炉床;壁炉地面; n. (Hearth)人名;(英)哈思","entry":"hearth"},{
    
    "explain":"adj. 衷心的;丰盛的;健壮的;精神饱满的; n. 朋友们;伙伴们","entry":"hearty"},{
    
    "explain":"n. 心跳;情感","entry":"heartbeat"}],"query":"heart","language":"en","type":"dict"}}

Post请求

    IEnumerator WWW_Post_Form()
    {
    
    
        //https://www.free-api.com/doc/522
        WWWForm wwwForm = new WWWForm();
        wwwForm.AddField("q","heart");//设置要查询单词
        wwwForm.AddField("doctype","json");//设置返回的数据格式为json

        string url = "http://dict.youdao.com/suggest";

        WWW www = new WWW(url,wwwForm);
        yield return www;
        if (string.IsNullOrEmpty(www.error))
        {
    
    
            Debug.LogWarning($"success,content:{
      
      www.text}");
        }
        else
        {
    
    
            Debug.LogWarning($"failed,msg:{
      
      www.error}");
        }
    }

返回的结果和Get请求的结果是一样的。

Headers头验证

上面讲述了Get/Post的用法,一般来说这样使用就足够了。不过发送Post请求时,还允许我们加上Headers头验证。
这个有什么作用呢,这个可以用来告知服务器我们传送的数据格式,比如可以说明我们传送过去的数据是默认格式或是json格式;网上查了一下,貌似也可以加上一些验证头,防止恶意访问。

这个一般来说是与服务器有什么约定,然后再按约定加上去就可以了。
我们了解下怎么使用就好,我们先看一下www的构造方法

public WWW(string url) //get请求可以使用
public WWW(string url, WWWForm form) //post请求,使用form携带数据
public WWW(string url, byte[] postData) //post请求,传递数据流
public WWW(string url, byte[] postData, Dictionary<string, string> headers)//post请求,允许携带hearders数据

第1个方法和第2个方法上面已经讲过了。
第3个方法,传递二进制数据。
其实依然可以像第2个方法那样用wwwForm携带数据。最后使用 wwwForm.data 获得二进制流,传入就可以。

第4个方法和第3个方法一样,只是最后加了一个字典参数,用于携带验证数据
接下来我们上第4个方法的使用代码

    IEnumerator WWW_Post_Bytes()
    {
    
    
        WWWForm wwwForm = new WWWForm();
        wwwForm.AddField("q","heart");
        wwwForm.AddField("doctype","json");

        string url = "http://dict.youdao.com/suggest";
        
        //这里添加headers字典
        Dictionary<string, string> postHeader = new Dictionary<string, string>();
        postHeader.Add("Content-Type", "application/x-www-form-urlencoded"); //默认
        // postHeader.Add("Content-Type", "application/json");//json
        
        WWW www = new WWW(url,wwwForm.data,postHeader);
        yield return www;
        if (string.IsNullOrEmpty(www.error))
        {
    
    
            Debug.LogWarning($"success,content:{
      
      www.text}");
        }
        else
        {
    
    
            Debug.LogWarning($"failed,msg:{
      
      www.error}");
        }
    }

其实就是一个字典,然后把约定好的数据传入就可以~

猜你喜欢

转载自blog.csdn.net/aaa27987/article/details/121108050