.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;
}

Post方法

Post请求是通过请求头(headers)的 Content-Type 字段值来描述其消息主体的编码方式

因此通过HttpWebRequest发送Post请求可有以下几方式 

              阅读延伸   四种常见的 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;
    }
}

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;
    }
}

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 + "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}\r\n";
        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 + "\r\nContent-Disposition: form-data; name=\"{0}\";filename=\"{1}\"\r\nContent-Type:application/octet-stream\r\n\r\n";
        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("\r\n\n" + boundary + "\r\nContent-Disposition: form-data; name=\"Upload\"\r\n\nSubmit Query\r\n" + 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

猜你喜欢

转载自www.cnblogs.com/xurongjian/p/12750905.html
今日推荐