最近的项目需要与服务器传输数据,请求的数据如下(并没有注意到“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)、空行和请求数据四个部分组成,如下图所示:
- 请求行:请求行由方法字段、URL 字段 和HTTP 协议版本字段 3 个部分组成,他们之间使用空格隔开。常用的 HTTP 请求方法有 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT;
- 请求头部:请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息;
- 空行:最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头;
- 请求包体:请求包体不在 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);
}