Unity C# 网络学习(七)——HTTP(一)

Unity C# 网络学习(七)——HTTP(一)

一.HTTP类

HttpWebRequest

        //创建新的HttpWebRequest,用于Http相关操作
        HttpWebRequest httpWebRequest = WebRequest.CreateHttp(new Uri("http://127.0.0.1"));
        //如果正在进行文件传输,用此方法可以停止
        httpWebRequest.Abort();
        //获取用于上传的流
        httpWebRequest.GetRequestStream();
        //返回http服务器的响应
        HttpWebResponse httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse;

        //======重要成员======
        //1.设置通信凭证
        httpWebRequest.Credentials = new NetworkCredential("", "");
        //2.是否随请求发送一个身份验证标头,一般需要进行身份验证时将其设置为true(与上面的通信凭证一起使用)
        httpWebRequest.PreAuthenticate = true;
        //3.构成表头的名称/值对的集合
        //httpWebRequest.Headers;
        //4.发送信息的字节数,上传信息时需要先设置该内容长度
        long len = httpWebRequest.ContentLength;
        //5.ContentType 在进行post请求时,需要对发送的内容进行内容类型的设置
        string contentType = httpWebRequest.ContentType;
        //6.操作命令设置
        //httpWebRequest.Method = ;

HttpWebResponse

        //释放所有资源
        httpWebResponse.Close();
        //获取下载的流数据
        httpWebResponse.GetResponseStream();
        //======重要成员======
        //1.接收数据的长度
        long l = httpWebResponse.ContentLength;
        //2.接收数据的类型
        var type = httpWebResponse.ContentType;
        //3.StatusCode Http服务器下发的最新状态码
        var statusCode = httpWebResponse.StatusCode;
        //4.StatusDescription Http服务器下发的最新状态码的文本
        var sd = httpWebResponse.StatusDescription;

二.HTTP下载

1.检测资源可用性

        try
        {
    
    
            HttpWebRequest httpWebRequest =
                WebRequest.CreateHttp(new Uri("http://192.168.1.103:8080/Http_Server/新建 Microsoft Word 文档 (1).docx"));
            //用 Head 请求类型获取信息
            httpWebRequest.Method = WebRequestMethods.Http.Head;
            httpWebRequest.Timeout = 2000;
            HttpWebResponse httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse;
            if (httpWebResponse == null) 
                return;
            if (httpWebResponse.StatusCode == HttpStatusCode.OK)
            {
    
    
                Debug.Log("文件存在且可用");
                Debug.Log(httpWebResponse.ContentLength);
                Debug.Log(httpWebResponse.ContentType);
            }
            else
            {
    
    
                Debug.Log("文件不能用:" + httpWebResponse.StatusCode);
            }
            httpWebResponse.Close();
        }
        catch (WebException we)
        {
    
    
            Debug.Log(we);
            return;
        }

2.下载资源

            HttpWebRequest httpWebRequest1 = WebRequest.CreateHttp(new Uri("http://192.168.1.103:8080/Http_Server/新建 Microsoft Word 文档 (1).docx"));
            httpWebRequest1.Method = WebRequestMethods.Http.Get;
            httpWebRequest1.Timeout = 3000;

            HttpWebResponse httpWebResponse1 = httpWebRequest1.GetResponse() as HttpWebResponse;
            if (httpWebResponse1 == null)
                return;
            if (httpWebResponse1.StatusCode == HttpStatusCode.OK)
            {
    
    
                Debug.Log(Application.persistentDataPath);
                using (FileStream fs = new FileStream(Application.persistentDataPath +"/zzs.docx",FileMode.Create))
                {
    
    
                    byte[] buffer = new byte[10240];
                    Stream s = httpWebResponse1.GetResponseStream();
                    if (s == null)
                        return;
                    int len = s.Read(buffer, 0, buffer.Length);
                    while (len>0)
                    {
    
    
                        fs.Write(buffer,0,len);
                        len = s.Read(buffer, 0, buffer.Length);
                    }
                    s.Close();
                }
            }
            httpWebResponse1.Close();
            Debug.Log("下载完成!");
        }
        catch (WebException we)
        {
    
    
            Debug.Log(we);
            return;
        }

三.HTTP下载封装

public class HTTPMgr
{
    
    
    public static HTTPMgr Instance {
    
     get; } = new HTTPMgr();
    private const string RootPath = "http://192.168.1.103:8080/Http_Server/";

    public async void DownLoad(string fileName, string outPath, Action<HttpStatusCode> action)
    {
    
    
        HttpStatusCode code = HttpStatusCode.OK;
        await Task.Run(() =>
        {
    
    
            try
            {
    
    
                HttpWebRequest httpWebRequest = WebRequest.CreateHttp(new Uri(RootPath + fileName));
                httpWebRequest.Method = WebRequestMethods.Http.Head;
                httpWebRequest.Timeout = 2000;
                HttpWebResponse httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse;
                if (httpWebResponse == null)
                {
    
    
                    code = HttpStatusCode.InternalServerError;
                    return;
                }

                if (httpWebResponse.StatusCode == HttpStatusCode.OK)
                {
    
    
                    httpWebRequest = WebRequest.CreateHttp(new Uri(RootPath + fileName));
                    httpWebRequest.Method = WebRequestMethods.Http.Get;
                    httpWebRequest.Timeout = 3000;
                    httpWebResponse.Close();
                    httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse;
                    if (httpWebResponse == null)
                    {
    
    
                        code = HttpStatusCode.InternalServerError;
                        return;
                    }

                    if (httpWebResponse.StatusCode == HttpStatusCode.OK)
                    {
    
    
                        Stream s = httpWebResponse.GetResponseStream();
                        if (s == null)
                        {
    
    
                            code = HttpStatusCode.InternalServerError;
                            return;
                        }

                        using (FileStream fs = new FileStream(outPath, FileMode.Create))
                        {
    
    
                            byte[] buffer = new byte[10240];
                            int len = s.Read(buffer, 0, buffer.Length);
                            while (len > 0)
                            {
    
    
                                fs.Write(buffer, 0, len);
                                len = s.Read(buffer, 0, buffer.Length);
                            }
                        }

                        s.Close();
                        code = HttpStatusCode.OK;
                    }
                    else
                    {
    
    
                        code = httpWebResponse.StatusCode;
                    }
                }
                else
                {
    
    
                    code = httpWebResponse.StatusCode;
                }

                httpWebResponse.Close();
            }
            catch (WebException we)
            {
    
    
                code = HttpStatusCode.InternalServerError;
                Debug.Log(we);
            }
        });
        action?.Invoke(code);
    }
}

猜你喜欢

转载自blog.csdn.net/zzzsss123333/article/details/125452181