HTTP类
HttpWebRequest类
命名空间:System.Net
HttpWebRequest是主要用于发送客户端请求的类
主要用于:发送HTTP客户端请求给服务器,可以进行消息通信、上传、下载等等操作
HttpWebRequest方法
创建WebRequest
HttpWebRequest req = HttpWebRequest.Create(new Uri("http://192.168.50.109:8000/Http_Server/")) as HttpWebRequest;终止传输
req.Abort();获取用于上传的流
Stream s = req.GetRequestStream();返回HTTP服务器响应
HttpWebResponse res = req.GetResponse() as HttpWebResponse;异步获取用于上传的流
req.BeginGetRequestStream();
req.EndGetRequestStream();异步获取返回的HTTP服务器响应
req.BeginGetResponse();
req.EndGetResponse();HttpWebRequest成员
通信凭证
设置为NetworkCredential对象
req.Credentials = new NetworkCredential("", "");是否随请求发送一个身份验证标头
一般需要进行身份验证时需要将其设置为true
req.PreAuthenticate = true;构成标头的名称/值对的集合
req.Headers;发送信息的字节数
上传信息时需要先设置该内容长度
req.ContentLength = 100;在进行POST请求时,需要对发送的内容进行内容类型的设置
req.ContentType操作命令设置
req.Method = WebRequestMethods.Http.Get;
// Get 获取请求,一般用于获取数据
// Post 提交请求,一般用于上传数据,同时可以获取
// Head 获取和Get一致的内容,只是只会返回消息头,不会返回具体内容
// Put 向指定位置上传最新内容
// Connect 表示与代理一起使用的 HTTP CONNECT 协议方法,该代理可以动态切换到隧道
// MkCol 请求在请求 URI(统一资源标识符)指定的位置新建集合了解该类的更多信息
https://docs.microsoft.com/zh-cn/dotnet/api/system.net.httpwebrequest?view=net-6.0
HttpWebResponse类
命名空间:System.Net
它主要用于获取服务器反馈信息的类
我们可以通过HttpWebRequest对象中的GetResponse()方法获取
当使用完毕时,要使用Close释放
HttpWebResponse方法
Close:释放所有资源GetResponseStream:返回从FTP服务器下载数据的流
HttpWebResponse成员
ContentLength:接受到数据的长度ContentType:接受数据的类型StatusCode:HTTP服务器下发的最新状态码StatusDescription:HTTP服务器下发的状态代码的文本BannerMessage:登录前建立连接时HTTP服务器发送的消息ExitMessage:HTTP会话结束时服务器发送的消息LastModified:HTTP服务器上的文件的上次修改日期和时间
了解该类的更多信息
https://docs.microsoft.com/zh-cn/dotnet/api/system.net.httpwebresponse?view=net-6.0
HTTP下载数据
检测资源可用性
try
{
//利用Head请求类型,获取信息
//1.创建HTTP通讯用连接对象HttpWebRequest对象
HttpWebRequest req = HttpWebRequest.Create(new Uri("http://192.168.50.49:8000/Http_Server/实战就业路线.jpg")) as HttpWebRequest;
//2.设置请求类型 或 其它相关参数
req.Method = WebRequestMethods.Http.Head;
req.Timeout = 2000;
//3.发送请求,获取响应结果HttpWebResponse对象
HttpWebResponse res = req.GetResponse() as HttpWebResponse;
if (res.StatusCode == HttpStatusCode.OK)
{
print("文件存在且可用");
print(res.ContentLength);
print(res.ContentType);
res.Close();
}
else
print("文件不能用" + res.StatusCode);
}
catch (WebException w)
{
print("获取出错" + w.Message + w.Status);
}下载资源
//利用Get请求类型,下载资源
try
{
//1.创建HTTP通讯用连接对象HttpWebRequest对象
HttpWebRequest req = HttpWebRequest.Create(new Uri("http://192.168.50.49:8000/Http_Server/实战就业路线.jpg")) as HttpWebRequest;
//2.设置请求类型 或 其它相关参数
req.Method = WebRequestMethods.Http.Get;
req.Timeout = 3000;
//3.发送请求,获取响应结果HttpWebResponse对象
HttpWebResponse res = req.GetResponse() as HttpWebResponse;
//4.获取响应数据流,写入本地路径
if (res.StatusCode == HttpStatusCode.OK)
{
print(Application.persistentDataPath);
using (FileStream fileStream = File.Create(Application.persistentDataPath + "/httpDownLoad.jpg"))
{
Stream downLoadStream = res.GetResponseStream();
byte[] bytes = new byte[2048];
//读取数据
int contentLength = downLoadStream.Read(bytes, 0, bytes.Length);
//一点一点的写入本地
while (contentLength != 0)
{
fileStream.Write(bytes, 0, contentLength);
contentLength = downLoadStream.Read(bytes, 0, bytes.Length);
}
fileStream.Close();
downLoadStream.Close();
res.Close();
}
print("下载成功");
}
else
print("下载失败" + res.StatusCode);
}
catch (WebException w)
{
print("下载出错" + w.Status + w.Message);
}Get请求类型携带额外信息
我们在进行HTTP通信时,可以在地址后面加一些额外参数传递给服务端
一般在和短连接游戏服务器通讯时,需要携带额外信息
举例:
http://www.aspxfans.com:8080/news/child/index.asp?boardID=5&ID=24618&page=1
这个链接可以分成几部分
协议部分:取决于服务器端使用的哪种协议
- http普通的http超文本传输协议
- https加密的超文本传输协议
域名部分:
也可以填写服务器的公网IP地址
端口部分:
8080
可以不写,如果不写默认为80
虚拟目录部分:
news/child/
域名后的/开始,到最后一个/之前的部分
文件名部分:
index.asp
参数部分:
boardID=5&ID=24618&page=1
?之后的部分就是参数部分,多个参数一&分隔开
实现HTTPMgr
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Events;
public class HttpMgr
{
private static HttpMgr instance = new HttpMgr();
public static HttpMgr Instance => instance;
private string HTTP_PATH = "http://192.168.50.49:8000/Http_Server/";
/// <summary>
/// 下载指定文件到本地指定路径中
/// </summary>
/// <param name="fileName">远程文件名</param>
/// <param name="loacFilePath">本地路径</param>
/// <param name="action">下载结束后的回调函数</param>
public async void DownLoadFile(string fileName, string loacFilePath, UnityAction<HttpStatusCode> action)
{
HttpStatusCode result = HttpStatusCode.OK;
await Task.Run(() =>
{
try
{
//判断文件是否存在 Head
//1.创建HTTP连接对象
HttpWebRequest req = HttpWebRequest.Create(HTTP_PATH + fileName) as HttpWebRequest;
//2.设置请求类型 和 其它相关参数
req.Method = WebRequestMethods.Http.Head;
req.Timeout = 2000;
//3.发送请求
HttpWebResponse res = req.GetResponse() as HttpWebResponse;
//存在才下载
if(res.StatusCode == HttpStatusCode.OK)
{
res.Close();
//下载
//1.创建HTTP连接对象
req = HttpWebRequest.Create(HTTP_PATH + fileName) as HttpWebRequest;
//2.设置请求类型 和 其它相关参数
req.Method = WebRequestMethods.Http.Get;
req.Timeout = 2000;
//3.发送请求
res = req.GetResponse() as HttpWebResponse;
//4.存储数据到本地
if(res.StatusCode == HttpStatusCode.OK)
{
//存储数据
using (FileStream fileStream = File.Create(loacFilePath))
{
Stream stream = res.GetResponseStream();
byte[] bytes = new byte[4096];
int contentLength = stream.Read(bytes, 0, bytes.Length);
while (contentLength != 0)
{
fileStream.Write(bytes, 0, contentLength);
contentLength = stream.Read(bytes, 0, bytes.Length);
}
fileStream.Close();
stream.Close();
}
result = HttpStatusCode.OK;
}
else
{
result = res.StatusCode;
}
}
else
{
result = res.StatusCode;
}
res.Close();
}
catch (WebException w)
{
result = HttpStatusCode.InternalServerError;
Debug.Log("下载出错" + w.Message + w.Status);
}
});
action?.Invoke(result);
}
}