Unity |WWW 带头部的Get请求

最近的项目需要与服务器传输数据,请求的数据如下(并没有注意到“Header”标识,其实看到也不会多思考)

因为之前也经常用WWW的Get请求,但只限于 public WWW(string url);这个函数的运用,所以没有多加思考便洋洋洒洒写下了下面的代码:

 IEnumerator GetUserInfo(string token)
    {
        WWW getinfo = new WWW("http://192.168.34.145:18082/v1/app/ucenter/user/info?X-Token=" + token);
        yield return getinfo;
        if (getinfo.isDone)
        {
            if (getinfo.error == null)
            {
                Debug.Log("获取到的用户信息:" + getinfo.text);

                loginPage.SetActive(false);
                FirstPage.SetActive(true);
            }
            else
            {
                Debug.Log("获取用户信息 出 错");
            }
        }

    }

运行后结果如下:

“没有带请求头”是什么鬼,网上一查,才知道一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,如下图所示:

  1. 请求行:请求行由方法字段、URL 字段 和HTTP 协议版本字段 3 个部分组成,他们之间使用空格隔开。常用的 HTTP 请求方法有 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT;
  2. 请求头部:请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息;
  3. 空行:最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头;
  4. 请求包体:请求包体不在 GET 方法中使用,而是在POST 方法中使用。POST 方法适用于需要客户填写表单的场合。与请求包体相关的最常使用的是包体类型 Content-Type 和包体长度 Content-Length。

HTTP 响应报文由状态行、响应头部、空行 和 响应包体 4 个部分组成,如下图所示:

 

具体HTTP工作原理见https://www.cnblogs.com/CodingUniversal/p/7524088.html

继续回到我的项目当中来,了解了头部原理后,代码改为如下所示:

 IEnumerator GetUserInfo(string token)
    {
        Dictionary<string, string> header = new Dictionary<string, string>();
        header.Add("X-Token", token);
        WWW getinfo = new WWW("http://192.168.34.145:18082/v1/app/ucenter/user/info", null, header);
        yield return getinfo;
        if (getinfo.isDone)
        {
            if (getinfo.error == null)
            {
                Debug.Log("获取到的用户信息:" + getinfo.text);

                loginPage.SetActive(false);
                FirstPage.SetActive(true);
            }
            else
            {
                Debug.Log("获取用户信息 出 错");
            }
        }
    }

请求到的数据如下:


扩展知识一、WWW()重载四运用

public WWW(string url, byte[] postData, Dictionary<string, string> headers);

例一:

string requestdata = "username=post&password=6789";
byte[] data= System.Text.UTF8Encoding.UTF8.GetBytes(requestdata);

Dictionary<string, string> header = new Dictionary<string, string>();   
headers.Add("Content-Type", "application/x-www-form-urlencoded");

WWW www = new WWW("http://127.0.0.1/Test.php", data, headers);

例二:

IEnumerator GetUserInfo(string token)
{
        //方法一
        //JsonData data = new JsonData();
        //data["X-Token"] = token;
        //byte[] postBytes = System.Text.Encoding.Default.GetBytes(data.ToJson());

        //方法二
        string requestdata = "X-Token="+token;
        byte[] postBytes = System.Text.UTF8Encoding.UTF8.GetBytes(requestdata);

        Dictionary<string, string> header = new Dictionary<string, string>();
        header.Add("X-Token", token);
        Debug.Log(token);

        WWW getinfo = new WWW("http://192.168.34.145:18082/v1/app/ucenter/user/add_use_count", postBytes, header);
        yield return getinfo;
}

扩展知识二、运用HttpWebRequest 进行带头部的请求

private void GetUserInfo(string token)
{
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://192.168.34.145:18082/v1/app/ucenter/user/info");    //创建一个请求示例 
        request.Headers["X-Token"] = token; 
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();  //获取响应,即发送请求
        Stream responseStream = response.GetResponseStream();
        StreamReader streamReader = new StreamReader(responseStream, System.Text.Encoding.UTF8);
        string str = streamReader.ReadToEnd();
        Debug.Log(str);
}

 

### 解析 Google 登录回调信息以提取 ID TokenUnity 中处理来自 Google 的登录回调信息并从中提取 ID Token 是实现第三方身份验证的重要分。通常情况下,Google 使用 OAuth 2.0 协议来进行认证流程,在此过程中会涉及到多个 URL 路径[^1]。 对于具体的解析过程而言: 当用户完成授权操作后,浏览器会被重定向到预先配置好的回调地址,并附带一系列查询参数。其中最重要的就是 `code` 参数以及可能存在的 `id_token` 参数。为了获取这些信息,应用程序需要监听特定的 URI 方案或深度链接机制。 一旦捕获到了完整的回调 URL,则可以通过简单的字符串分割方法来分离各个组成分。特别是针对包含 `#` 符号分隔开来的 fragment 分(即哈希后的片段),因为这正是承载着我们需要的数据的地方之一。 下面是一个基于 C# 编写的简单函数示例,用于从给定的回调 URL 提取出 ID Token: ```csharp using System; using UnityEngine; public class GoogleLoginHandler : MonoBehaviour { public string ExtractIdTokenFromCallbackUrl(string callbackUrl){ Uri uriResult; bool result = Uri.TryCreate(callbackUrl, UriKind.Absolute, out uriResult); if (!result || !uriResult.IsAbsoluteUri) { Debug.LogError("Invalid Callback Url"); return null; } var queryFragment = uriResult.Fragment; // 获取fragment分 foreach (var pair in queryFragment.TrimStart('#').Split('&')){ var keyValue = pair.Split('='); if(keyValue.Length != 2) continue; switch(keyValue[0]){ case "id_token": return Uri.UnescapeDataString(keyValue[1]); } } Debug.LogWarning("No id_token found."); return null; } } ``` 该代码段展示了如何安全地创建一个 URI 对象以便于后续的操作;接着检查传入的 URL 是否有效;最后遍历 fragment 后面携带的所有键值对寻找名为 `id_token` 的项,并对其进行解码返回其原始形式。 值得注意的是,上述逻辑仅适用于直接包含了 ID Token 的情况。如果服务器响应中只提供了临时授权码 (`authorization code`) ,那么还需要进一步向 `/oauth/token` 接口发起请求交换正式的访问令牌和刷新令牌等凭证。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烫青菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值