470 likes | 620 Views
第 8 章 HTTP 应用编程. 网络应用编程. 网络应用编程 – 回顾. Web 服务器. B. B. HTTP. 思考: 是不是 HTTP 仅仅能用于 B/S 模式?. 思考:在日常生活中哪些场景见到过 HTTP?. B. B. B /S. 第 8 章 HTTP 应用编程. 任务 1 :模拟提交web请求 演示程序. 第 8 章 HTTP 应用编程. 任务 2 --模拟自动登录 : 自动化测试 恶意攻击. 第 8 章 HTTP 应用编程. 任务 3 : HTTP多线程下载. 第 8 章 HTTP 应用编程.
E N D
第8章 HTTP应用编程 网络应用编程
网络应用编程– 回顾 Web服务器 B B • HTTP ... 思考:是不是HTTP仅仅能用于B/S模式? 思考:在日常生活中哪些场景见到过HTTP? B B B/S
第8章 HTTP应用编程 任务1:模拟提交web请求 演示程序
第8章 HTTP应用编程 任务2--模拟自动登录: 自动化测试 恶意攻击
第8章 HTTP应用编程 任务3: HTTP多线程下载
第8章 HTTP应用编程 8.1 HTTP简介 8.2 HTTP编程相关类 8.3 利用HTTP实现多线程文件下载
图1 HTTP 请求过程 HTTP(HyperText Transfer Protocol ) 超文本传输协议
HTTP/1.1 200 OKDate: Sat, 31 Dec 2005 23:59:59 GMTContent-Type: text/html;charset=ISO-8859-1Content-Length: 122 <html> <head> <title>Wrox Homepage</title> </head> <body> First HTML </body> </html> 将实际响应内容用 浏览器打开观察效果?
HTTP(HyperText Transfer Protocol ) 全称:超文本传输协议 定义Web服务器和浏览器之间传输的沟通方式 早期:HTML文件 发展:音频文件、视频文件等 说明: 目前常用的HTTP协议的版本是Http1.1 RFC 2616描述了HTTP协议的具体信息 8.1 HTTP简介
8.1.1 HTTP的特点 (1)HTTP是无状态的 (2)HTTP以TCP方式工作 (3)HTTP使用元信息作为标头
8.1.1 HTTP的特点 HTTP是无状态的 “无状态”:客户端发送一次请求后,服务器并没有存储关于该客户端的任何状态信息。例如: Public int LoginCount = 0; void Login() { … … if(Success) LoginCount += 1; } 解决方案: 客户端Cookie,服务器端Session 登录成功N次后 loginCouent=N?
8.1.1 HTTP的特点 HTTP以TCP方式工作,不丢失数据,不乱序 非持久连接(早期) 持久连接(当前) 服务器 打开TCP连接 客户端 请求报文 响应报文 关闭TCP连接 图2 非持久连接
8.1.1 HTTP的特点 HTTP使用元信息作为标头 HTTP通过添加标头(Header)的方式向服务器提供本次HTTP请求的相关信息,即在主要数据前添加一部分信息,称为元信息(Metainformation)。 例如,传送的对象属于哪种类型,采用的是哪种编码等 <request line> <headers> <blank line> <request-body>
8.1.2 HTTP的请求与响应 本节主要内容 请求报文格式 响应报文格式 请求类型 演示利用HttpWatch软件,实时进行Http协议分析。 怎么看到HTTP的请求报文和响应报文?
8.1.2 HTTP的请求与响应 请求报文例子: 请求行 头部 空行 请求主题
8.1.2 HTTP的请求与响应 1.HTTP请求:客户端将HTTP请求发送到服务器时,格式如下: <request-line> : 请求行 Method URL Version <headers> : 标头部分,说明服务器要使用的附加信息,一般由多行组成。 <blank line> : 标头之后是一个空行 [<request-body>] : 空行之后是请求的主体,主题中可以包含任意数据
8.1.2 HTTP的请求与响应 Method URL Version Headers request body 注意空行 例子 POST /TheStockExchange/Trading/GetStockPrice.asp HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded Content-Length: 11 name=Professional&publisher=Wiley 注意空行
8.1.2 HTTP的请求与响应 2.HTTP响应 一般格式为: <status-line>:Version StatusCode Description<headers> <blank line> [<response-body>] <status-line> 状态行: 所有HTTP响应的第一行 内容依次是当前HTTP版本号、3位数字组成的状态码以及描述状态的短语,空格分隔
8.1.2 HTTP的请求与响应 状态码的第一个数字代表当前响应的类型,规定如下。 1xx 消息—请求已被服务器接收,继续处理。 2xx 成功—请求已成功被服务器接收、理解、并接受 3xx 重定向—需要后续操作才能完成这一请求。 4xx 请求错误—请求含有词法错误或者无法被执行。 5xx 服务器错误—服务器处理某个正确请求时发生错误
8.1.2 HTTP的请求与响应 2.HTTP响应 HTTP常用状态码
8.1.2 HTTP的请求与响应 例子 HTTP/1.1 200 OKDate: Sat, 31 Dec 2005 23:59:59 GMTContent-Type: text/html;charset=ISO-8859-1Content-Length: 122 <html> <head> <title>Wrox Homepage</title> </head> <body> testtest </body> </html> 注意空行
8.1.2 HTTP的请求与响应 3.Http请求方式 (1)Get方式 最常见的请求,表示客服端告诉服务器获取哪些资源 例如:用户在Web浏览器上输入www.baidu.cn,此时浏览器向服务器发送的就是一个GET请求,内部发送的信息如下 GET / HTTP/1.1 Host: www.baidu.cn User-Agent: (内容太长,此处省略) Connection: Keep-Alive (此处为一空行)
8.1.2 HTTP的请求与响应 3.Http请求方式 (1)Get方式 提交的数据附在URL之后(请求行) 例如:要输入查询条件problem后,点击搜索那么内部发送的信息可能类似下面的内容: GET /s?wd=problem&rsv_bp=0&… HTTP/1.1 Host: www.baidu.cn User-Agent: …… Connection: Keep-Alive (此处为一空行) 注意:只有第1行的内容发生了变化,观察地址栏???
8.1.2 HTTP的请求与响应 3.Http请求方式 (1)Get方式 修改登录页面的表单提交方式为GET,观察地址栏
8.1.2 HTTP的请求与响应 参数在地址栏中显示,header中的请求行中传送 格式:以?分割URL和传输数据,key=value参数对之间以&相连 如数据是英文字母/数字,原样发送 如是空格,转换为+ 如是中文/其他字符,直接把字符串用BASE64加密,%XX中的XX为该符号以16进制表示的ASCII 例如 name=hyddd&password=idontknow
8.1.2 HTTP的请求与响应 (2)POST请求 用途:要求服务器接收大量的信息,一般用于提交Form表单。 POST VS GET GET: 在URL后面附加信息 POST:在请求主体中为服务器提供附加信息 演示: 提交Form表单时分别选择GET和POST观察地址栏的变化.
8.1.2 HTTP的请求与响应 (2)POST请求 参数键值对存放在请求主体中,而非在地址中。例如: POST /Login.aspx HTTP/1.1 User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) Content-Type: application/x-www-form-urlencoded Host: localhost:2207 Content-Length: 49 Connection: Keep-Alive (此处为一空行) name=a&passwd=b&mysubmitButton=%E7%99%BB%E5%BD%95
8.1.2 HTTP的请求与响应 HEAD请求 HEAD请求获得header部分。 因此HEAD方法通常不单独使用,而是和其他的请求方法一起起到辅助作用。 例如: 一些搜寻引擎使用的自动搜索机器人采用这个方法来获得网页的标志信息 检查远程文件下载链接是否可用
第8章 HTTP应用编程 8.1 HTTP简介 8.2 HTTP编程相关类 8.3 利用HTTP实现多线程文件下载
8.2 HTTP编程相关类 应用分析 简化版的浏览器 抓取页面源码 表单自动填入 模拟自动登录 文件上传 文件下载
8. 2. 4 利用GET方法提交请求的数据 例1:编写程序,制作简化版本的浏览器 访问www.baidu.com,抓取页面内容
8.2.1 WebRequest类和HttpWebRequest类 GET / HTTP/1.1 Host: www.baidu.cn User-Agent: (内容太长,此处省略) Connection: Keep-Alive (此处为一空行)
8.2.1 WebRequest类和HttpWebRequest类 WebRequest: 请求/响应模型的抽象(abstract)基类。 用于访问Internet数据。 用协议不可知的方式从Internet请求数据。 HttpWebRequest: 是针对于HTTP的特定实现。 该类通过HTTP和服务器交互 HttpWebRequest WebRequest
8.2.3 Uri类 为了使URI具有规范化格式,Uri构造函数执行以下步骤。 (1)将URI方案转换为小写。 (2)将主机名转换为小写。 (3)移除默认端口号和空端口号。 (4)移除多余的段(如“/”和“/test”段)以简化URI 下面的代码创建Uri类的实例,并用它来创建 WebRequestUri siteUri = new Uri("http://www.contoso.com/"); WebRequest request = WebRequest.Create(siteUri);。
8.2.1 WebRequest类和HttpWebRequest类 模拟HTTP请求 创建HttpWebRequest对象,例如 HttpWebRequest request = 设置相关属性,模拟POST或者GET方式获取数据 request.Methed = "GET"; request.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)“ … … … • (HttpWebRequest) WebRquest.Create(“http://msdn.microsoft.com")
8.2.2 WebResponse类和HttpWebResponse类 模拟HTTP请求 提交请求 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 访问响应信息 response.StatusCode response.GetResponseStream(); 释放资源
8.2.4 利用GET方法提交请求的数据 例1:简化版浏览器
8.2.4 利用GET方法提交请求的数据 例2:修改程序,以GET方式提交搜索条件? www.test.com?grade=1&school=henu 访问www.baidu.com,抓取页面内容
8.2.4 利用GET方法提交请求的数据 小结 构造HttpWebRequest对象,注意参数以键值对的形式,追加在URL地址后 request.Methed="GET" GetResponse对象,提交请求 获取响应流,抓取页面内容
8.2.5 利用POST方法提交请求的数据 模拟登录 考虑和GET方式的不同?
8.2.5 利用POST方法提交请求的数据 原理:POST请求时,参数键值对存放在请求主体中,而非在地址中。例如: POST /Login.aspx HTTP/1.1 User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) Content-Type: application/x-www-form-urlencoded Host: localhost:2207 Content-Length: 49 Connection: Keep-Alive (此处为一空行) name=a&passwd=b&mysubmitButton=%E7%99%BB%E5%BD%95
8.2.5 利用POST方法提交请求的数据 例3:演示模拟登录 建立ASP.NET web应用程序 建立模拟登录程序,模拟POST请求提交数据
8.3 利用HTTP实现多线程文件下载 例8-3的运行界面
8.3 利用HTTP实现多线程文件下载 使用迅雷、网络蚂蚁或网络快车等软件从因特网上下载文件的经历,这些软件由于采用了多线程下载技术,因此下载的速度非常快。 核心步骤: (1)下载数据时,首先需要知道某个Web资源是否有效,利用HTTP的HEAD方法,根据标头返回的状态码,即可以确定资源的可用性。P219 (2)实现多线程下载的关键是了解如何获取下载文件的总长度以及如何从源文件下载指定范围的数据。P220 (3) 各个线程如何分布下载,并最终完成文件所有内容的下载?