读取 HttpWebRequest 的 HTTP POST 请求

Posted

技术标签:

【中文标题】读取 HttpWebRequest 的 HTTP POST 请求【英文标题】:Read the HTTP POST request of HttpWebRequest 【发布时间】:2012-08-02 00:53:31 【问题描述】:

我需要为我正在编写的一些测试创建 Http POST 请求和一些 GET 请求作为字符串。目前,我的测试使用 StringBuilder 构建它们,并且从提琴手中提取的硬编码 POST 请求有点像这样:

var builder = new StringBuilder();
builder.Append("POST https://some.web.pg HTTP/1.1\r\n");
builder.Append("Content-Type: application/x-www-form-urlencoded\r\n");
builder.Append("Referer: https://some.referer.com\r\n");
builder.Append("Accept-Language: en-us\r\n");
builder.Append("Accept-Encoding: gzip, deflate\r\n");
builder.Append("User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)\r\n");
builder.Append("Host: login.yahoo.com\r\n");
//    ... other header info
builder.Append("\r\n");
builder.Append("post body......\r\n");
var postData = builder.ToString();

这很快使我的测试变得混乱,并且希望有一种更简洁的方式来构建这些 POST 请求。我一直在研究 HttpWebRequest 类,希望它可以为我创建这些。我认为,它必须有某种方式来构建这个我试图以某种形式创建的确切请求。但可惜的是,GetRequestStream 是一个只可写的流。

有没有办法读取 HttpWebRequest 将生成的请求流(然后将其更改为字符串)?甚至任何关于如何生成这些 POST 请求的想法都可以。

【问题讨论】:

【参考方案1】:
    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(yoururllink);
    var c = HttpContext.Current;

    //Set values for the request back
    req.Method = "POST";
    req.ContentType = "application/x-www-form-urlencoded";
    byte[] param = Request.BinaryRead(HttpContext.Current.Request.ContentLength);
    string strRequest = Encoding.ASCII.GetString(param);
    string strResponse_copy = strRequest;  //Save a copy of the initial info sent from your url link
    strRequest += "&cmd=_notify-validate";
    req.ContentLength = strRequest.Length;

    //for proxy
    //WebProxy proxy = new WebProxy(new Uri("http://url:port#"));
    //req.Proxy = proxy;

    //Send the request to PayPal and get the response
    StreamWriter streamOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII);
    streamOut.Write(strRequest);
    streamOut.Close();
    StreamReader streamIn = new StreamReader(req.GetResponse().GetResponseStream());
    string strResponse = streamIn.ReadToEnd();
    streamIn.Close();

【讨论】:

【参考方案2】:

我建议您使用模拟,因为它是单元测试的最佳实践: 在堆栈上看到这个答案 Unit testing HTTP requests in c#

【讨论】:

【参考方案3】:

这里是一个用于发出 Get 请求的 msdn 示例:

using System;

使用 System.Net; 使用 System.IO;

命名空间 MakeAGETRequest_charp /// /// Class1 的摘要描述。 /// 类 Class1 静态无效主要(字符串 [] 参数) 字符串网址; sURL = "http://www.microsoft.com";

        WebRequest wrGETURL;
        wrGETURL = WebRequest.Create(sURL);

        WebProxy myProxy = new WebProxy("myproxy",80);
        myProxy.BypassProxyOnLocal = true;

        wrGETURL.Proxy = WebProxy.GetDefaultProxy();

        Stream objStream;
        objStream = wrGETURL.GetResponse().GetResponseStream();

        StreamReader objReader = new StreamReader(objStream);

        string sLine = "";
        int i = 0;

        while (sLine!=null)
        
            i++;
            sLine = objReader.ReadLine();
            if (sLine!=null)
                Console.WriteLine("0:1",i,sLine);
        
        Console.ReadLine();
    

这里是一个 for post 请求(来自HTTP request with post)

    HttpWebRequest httpWReq =
    (HttpWebRequest)WebRequest.Create("http:\\domain.com\page.asp");

ASCIIEncoding encoding = new ASCIIEncoding();
string postData = "username=user";
postData += "&password=pass";
byte[] data = encoding.GetBytes(postData);

httpWReq.Method = "POST";
httpWReq.ContentType = "application/x-www-form-urlencoded";
httpWReq.ContentLength = data.Length;

using (Stream newStream = httpWReq.GetRequestStream())

    newStream.Write(data,0,data.Length);

【讨论】:

以上是关于读取 HttpWebRequest 的 HTTP POST 请求的主要内容,如果未能解决你的问题,请参考以下文章

急急急!C#中winform发送 HttpWebRequest请求,不能连续发送

HttpWebRequest类

C# HttpWebRequest - 如何确定是不是发生了 HTTP 301?

c# HttpWebResponse判断返回请求的问题

HttpWebRequest类

HttpWebRequest发http参数