5.5 发送简单的HTTP POST请求给传统的ASP网页
问题
如何发送一个简单的HTTP POST请求给普通的ASP网页/脚本,并且返回相应的HTTP响应。
设计
创建HttpWebRequest类的一个实例,设置这个对象的Method属性为“POST”,ContentType属性为“application/x-www-form-urlencoded”。通过GetRequestStream()方法和Stream.Write()为要发起的请求添加POST数据。然后通过HttpWebRequest.GetResponse()方法取回相应的HTTP响应。
方案
string url = "http://localhost/TestAuto/Ch5/classic.asp";
string data = "inputBox1=orange";
byte[] buffer = Encoding.ASCII.GetBytes(data);
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = buffer.Length;
Stream reqst = req.GetRequestStream();
reqst.Write(buffer, 0, buffer.Length);
reqst.Flush();
reqst.Close();
Console.WriteLine("\nPosting 'orange'");
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
Stream resst = res.GetResponseStream();
StreamReader sr = new StreamReader(resst);
Console.WriteLine("\nGrabbing HTTP response\n");
Console.WriteLine(sr.ReadToEnd());
sr.Close();
resst.Close();
Console.WriteLine("Done");
注解
设想有一个如下的HTML网页:
<html>
<!-- classic.html -->
<body>
<form name="theForm" method="post" action="classic.asp">
<p>Enter color:
<input type="text" name="inputBox1"/>
</p>
<input type="submit" value="Send It"/>
</form>
</body>
</html>
并且有一个与之相关的普通ASP网页/脚本如下:
<html>
<!-- classic.asp -->
<body>
<p>You submitted: </p>
<%
strColor = Request.Form("inputBox1")
Response.Write(strColor)
%>
<p>Bye</p>
</body>
</html>
如果用户把网页加载到classic.html一个诸如IE这样的Web客户端,会显示一个“Enter color:”提示和一个文本框。在输入一些文本并且单击submit按钮之后,程序会发送一个包含HTML窗体数据的HTTP请求给Web服务器。Web服务器会接受POST请求并且运行classic.asp脚本。这个脚本把文本框里的值提取出来,并且把它插入到表示HTML结果的字节流(HTML result stream),这个字节流随后会作为HTTP响应返回给客户端(在这里HTML元素以友好的方式呈现出来)。
直接向classic.asp页面/脚本发送HTTP请求并返回HTTP响应,最为灵活的方法就是使用HttpWebRequest类。关键是首先要准备好用于发送的数据,这些数据以“名字-值”的字符串形式存在,并且用“&”连起来:
string data = "inputBox1=orange&inputBox2=green";
接下来,必须使用System.
Text.Encoding.ASCII.GetBytes()方法把要发送的数据从字符串转换成一个字节数组,因为所有的HTTP数据都是以字节的形式来传送的。创建HttpWebRequest 对象之后,必须把这个对象的“HttpWebRequest”属性设为“POST”并且把ContentTyp属性设为“application/x-www-form-urlencoded”。你可以把ContentType值想象成一个特殊的字符串,这个字符串告诉Web服务器把收到的HTTP 请求作为HTML窗体数据来解析。ContentLength
属性的值必须设为存储待发送数据的字节数组的长度。请注意因为要填充ContentLength的属性值,所以必须在创建HttpWebRequest对象之前准备好要发送的数据。准备好要发送的请求以后,可以通过HttpWebRequest.GetRequestStream()方法得到这个请求的数据流,然后就可以把要发送的数据加入这个数据流。通过下面这个语句就可以把要发送的数据写入数据流:
reqst.Write(buffer, 0, buffer.Length);
写入请求数据流的字节数组,以及从字节数组的什么位置作为开始,要写入多少个字节,都是由你来指定的。如果使用Length属性指定要写入的字节个数,将要写入请求数据流的就是整个字节数组。完成这些之后,就可以发送这个HTTP请求并且通过StreamReader对象以字符串的形式取回随后的HTTP响应。如果运行上述方案,得到的输出如下:
Posting 'orange'
Grabbing HTTP response:
<html>
<!-- classic.asp -->
<body>
<p>You submitted: </p>
orange
<p>Bye</p>
</body>
</html>
Done
这种技术用到了HttpWebRequest类和HttpWebResponse类,但是你也可以使用WebClient类或者WebRequest和WebResponse类。本节所讲述的技术适用于检查普通的ASP Web程序,但是要将这种技术扩展成自动化测试程序,你必须在HTTP响应中查找预先设定的期望值,我们将在5.11节进行讨论。
这种技术假定要“POST”的数据字符串不包含任何可能被Web服务器错误地进行解释的特殊字符,比如空格和“&”。要处理这些特殊字符,请参见5.7节的内容。这个方案还假定HTTP请求-响应不穿越代理服务器。要处理有代理服务器的情况,请参见5.6节的注解部分。







