首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

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节的注解部分。

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论