2012-08-04 2 views
0

Мне нужно создать запросы Http POST и, возможно, несколько запросов GET как строки для некоторых тестов, которые я пишу. В настоящее время, мои тесты построить их с помощью StringBuilder и жестко закодированные запросы POST вытащили из стельки вроде как это:Прочитайте запрос HTTP POST для HttpWebRequest

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, будут делать.

ответ

0

здесь проба MSDN, чтобы сделать запрос Получить:

using System; 

использованием System.Net; с использованием System.IO;

имен MakeAGETRequest_charp { /// /// Краткое описание для Class1. /// класс Class1 { static void Main (string [] args) { { string sURL; 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(); 
    } 
} 

} а вот для почтового запроса (от 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); 
} 
0

Я советую вам использовать насмешливый, потому что это лучшая практика на единицу теста: увидеть этот ответ на стек Unit testing HTTP requests in c#

0
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();