zoukankan      html  css  js  c++  java
  • .NET HttpWebRequest发送请求的几个方法

    Get方法

    public string HttpGet(string Url, string param)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (param == "" ? "" : "?") + param);
        request.Method = "GET";
        request.ContentType = "application/x-www-form-urlencoded";
    
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream myResponseStream = response.GetResponseStream();
    
        StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
        string retString = myStreamReader.ReadToEnd();
        myStreamReader.Close();
        myResponseStream.Close();
    
        return retString;
    }
    //使用示例
    HttpGet("http://192.168.2.100/xxx", "SchoolID=S27-511-AF57&UserID=S001")

     

    Post方法

    Post请求是通过请求头(headers)的 Content-Type 字段值来描述其消息主体的编码方式,在日常开发中以下3种编码方式比较常见的:

    • application/x-www-form-urlencoded 
    • application/json;charset=UTF-8 
    • multipart/form-data

    其他详细的 Content-Type 讲解可以参考这篇文章 四种常见的 POST 提交数据方式 专题 

    所以,使用 HttpWebRequest 发送请求POST的 “姿势”(数据格式),会因为消息主体的编码方式的不同而有所差异。

    1、application/x-www-form-urlencoded 

    public string HttpPost(string url, string param)
    {
        HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
        Encoding encoding = Encoding.UTF8;
        byte[] byteArray = Encoding.UTF8.GetBytes(param);
        string responseData = String.Empty;
        req.Method = "POST";
        req.ContentType = "application/x-www-form-urlencoded";
        req.ContentLength = byteArray.Length;
    
        using (Stream reqStream = req.GetRequestStream())
        {
            reqStream.Write(byteArray, 0, byteArray.Length);
        }
        using (HttpWebResponse response = (HttpWebResponse)req.GetResponse())
        {
            using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding))
            {
                responseData = reader.ReadToEnd();
            }
            return responseData;
        }
    }

    //使用示例
    HttpPost("http://192.168.2.100/xxx", "SchoolID=S27-511-AF57&UserID=S001")

    2、application/json;charset=UTF-8 

    public string HttpPost(string url, Dictionary<string, object> param)
    {
        HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
        Encoding encoding = Encoding.UTF8;
        byte[] byteArray = Encoding.UTF8.GetBytes(new JavaScriptSerializer().Serialize(param));
        string responseData = String.Empty;
        req.Method = "POST";
        req.ContentType = "application/json;charset=UTF-8";
        req.ContentLength = byteArray.Length;
    
        using (Stream reqStream = req.GetRequestStream())
        {
            reqStream.Write(byteArray, 0, byteArray.Length);
        }
        using (HttpWebResponse response = (HttpWebResponse)req.GetResponse())
        {
            using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding))
            {
                responseData = reader.ReadToEnd();
            }
            return responseData;
        }
    }

    //使用示例

      Dictionary<string, object> param = new Dictionary<string, object>();
      param.Add("SchoolID", "S27-511-AF57");
      param.Add("UserID", "S001");
      HttpPost("http://192.168.2.100/xxx", param);

     

    3、multipart/form-data ,一般用来上传文件

    public string HttpPost(string url, string file)
    {
        //边界
        string boundary = DateTime.Now.Ticks.ToString("x");
    
        HttpWebRequest uploadRequest = (HttpWebRequest)WebRequest.Create(url);//url为上传的地址
        uploadRequest.ContentType = "multipart/form-data; boundary=" + boundary;
        uploadRequest.Method = "POST";
        uploadRequest.Accept = "*/*";
        uploadRequest.KeepAlive = true;
        uploadRequest.Headers.Add("Accept-Language", "zh-cn");
        uploadRequest.Headers.Add("Accept-Encoding", "gzip, deflate");
        uploadRequest.Credentials = System.Net.CredentialCache.DefaultCredentials;
        //uploadRequest.Headers["Cookie"] = cookies;//上传文件时需要的cookies
    
        WebResponse response;
        string responseData = String.Empty;
        //创建一个内存流
        Stream memStream = new MemoryStream();
    
    
        //确定上传的文件路径
        if (!String.IsNullOrEmpty(file))
        {
            boundary = "--" + boundary;
    
            //添加上传文件参数格式边界
            string paramFormat = boundary + "
    Content-Disposition: form-data; name="{0}";
    
    {1}
    ";
            NameValueCollection param = new NameValueCollection();
            param.Add("fname", Guid.NewGuid().ToString() + Path.GetExtension(file));
    
            //写上参数
            foreach (string key in param.Keys)
            {
                string formitem = string.Format(paramFormat, key, param[key]);
                byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
                memStream.Write(formitembytes, 0, formitembytes.Length);
            }
    
            //添加上传文件数据格式边界
            string dataFormat = boundary + "
    Content-Disposition: form-data; name="{0}";filename="{1}"
    Content-Type:application/octet-stream
    
    ";
            string header = string.Format(dataFormat, "Filedata", Path.GetFileName(file));
            byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
            memStream.Write(headerbytes, 0, headerbytes.Length);
    
            //获取文件内容
            FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read);
            byte[] buffer = new byte[1024];
            int bytesRead = 0;
            //将文件内容写进内存流
            while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
            {
                memStream.Write(buffer, 0, bytesRead);
            }
    
            fileStream.Close();
            //添加文件结束边界
            byte[] boundarybytes = System.Text.Encoding.UTF8.GetBytes("
    
    " + boundary + "
    Content-Disposition: form-data; name="Upload"
    
    Submit Query
    " + boundary + "--");
            memStream.Write(boundarybytes, 0, boundarybytes.Length);
    
            //设置请求长度
            uploadRequest.ContentLength = memStream.Length;
            //获取请求写入流
            Stream requestStream = uploadRequest.GetRequestStream();
    
            //将内存流数据读取位置归零
            memStream.Position = 0;
            byte[] tempBuffer = new byte[memStream.Length];
            memStream.Read(tempBuffer, 0, tempBuffer.Length);
            memStream.Close();
    
            //将内存流中的buffer写入到请求写入流
            requestStream.Write(tempBuffer, 0, tempBuffer.Length);
            requestStream.Close();
        }
    
        //获取到上传请求的响应
    
        response = uploadRequest.GetResponse();
    
        using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
        {
            responseData = reader.ReadToEnd();
        }
        return responseData;
    }
    此方法出处
    作者:Louja
    原址:https://www.cnblogs.com/loujady/archive/2011/09/13/2174695.html
  • 相关阅读:
    调试STM32/8 程序一些浅显又不易发现的问题
    MS5611 转换时间和精度的关系
    matlab 实用快捷键
    计算机中十六进制数对应的内存大小速记
    matlab 基本变量和函数
    自定义Button形状(圆形、椭圆)
    Android:自定义标题栏
    Python-21-socket编程
    Python-20-异常处理
    Python-19-元类
  • 原文地址:https://www.cnblogs.com/xurongjian/p/12750905.html
Copyright © 2011-2022 走看看