笔记2:WebRequest 及 WebResponse 类介绍
2016-04-30 10:50
696 查看
一、WebRequest 及 WebResponse 类运行机制
WebRequest对象负责链接到远端服务器主机,并且将客户端的要求消息,传送到服务器;
WebResponse对象则封装服务器响应的消息内容,最后客户端通过WebResponse对象,取得其中的内容。
若仅是单纯地要求与响应操作,只需进行链接动作,然后取得响应的WebResponse 对象即可。
若是牵涉到数据的写入或是读取,需结合数据流进行实际应用。
WebRequests在向服务器提出链接要求的同时,进一步通过数据流对象将数据写入;在返回的WebResponse对象中,取得响应的数据流,读取服务器响应的数据内容。
二、创建WebRequest 与 WebResponse 对象
WebRequest是抽象类,本身并不包含用以建立实体对象所需的公用表达式,无法利用此类直接进行网络数据的存取操作。可用Create()方法建立WebRequest类实体
Response对象响应所需的消息数据,方法GetResponse()返回此结果对象:
返回的WebResponse对象,它提供的方法成员,取得网络服务器端所返回的数据内容。
三、数据流的去与回
数据流向服务器发送:
WebRequest的方法成员GetRequestStream返回一个Stream类对象,你可以由此对象将数据写入因特网,这个方法被定义为Overridable,必须在衍生的子类中覆写:
从服务器取得:
WebResponse的方法成员GetResponseStream,返回一个Stream数据流对象,这个对象封装了服务器的相关响应消息,此方法同样必须在其衍生的子类里被覆写。
四、读取网页源代码
随便输入一个网页,用来读取返回的源代码信息。
程序运行正常,但是结果不尽人意,可以看到网页源代码是残缺的,哪里出了问题呢?
咱也没弄明白,难道是缓存1024有问题?
改下缓存情况
结果有点改善,但是源代码仍然没有显示完全 :
抓狂,到底哪里出了问题?
再改代码,用StreamReader来读整个响应流:
结果是完美的,源代码完美呈现。
总结本节:1、响应中读取数据流;
2、前2次网页源代码为什么会出现残缺?知道的,请留言。
WebRequest对象负责链接到远端服务器主机,并且将客户端的要求消息,传送到服务器;
WebResponse对象则封装服务器响应的消息内容,最后客户端通过WebResponse对象,取得其中的内容。
若仅是单纯地要求与响应操作,只需进行链接动作,然后取得响应的WebResponse 对象即可。
若是牵涉到数据的写入或是读取,需结合数据流进行实际应用。
WebRequests在向服务器提出链接要求的同时,进一步通过数据流对象将数据写入;在返回的WebResponse对象中,取得响应的数据流,读取服务器响应的数据内容。
二、创建WebRequest 与 WebResponse 对象
WebRequest是抽象类,本身并不包含用以建立实体对象所需的公用表达式,无法利用此类直接进行网络数据的存取操作。可用Create()方法建立WebRequest类实体
PublicShared Function Create(String) As WebRequest PublicShared Function Create(ByVal requestUri As Uri) As WebRequest
Response对象响应所需的消息数据,方法GetResponse()返回此结果对象:
Public FunctionGetResponse() As WebResponse
返回的WebResponse对象,它提供的方法成员,取得网络服务器端所返回的数据内容。
三、数据流的去与回
数据流向服务器发送:
WebRequest的方法成员GetRequestStream返回一个Stream类对象,你可以由此对象将数据写入因特网,这个方法被定义为Overridable,必须在衍生的子类中覆写:
OverridablePublic Function GetRequestStream() As Stream
从服务器取得:
WebResponse的方法成员GetResponseStream,返回一个Stream数据流对象,这个对象封装了服务器的相关响应消息,此方法同样必须在其衍生的子类里被覆写。
OverridablePublic Function GetResponeeStream() As Stream
四、读取网页源代码
随便输入一个网页,用来读取返回的源代码信息。
Imports System.IO Imports System.Net Imports System.Text Public Class Form1 Private Sub btnGet_Click(sender As Object, e As EventArgs) Handles btnGet.Click Dim wqRequest As WebRequest Dim wpResponse As WebResponse Dim myStream As Stream Dim strCode As String = "" Dim strAddress As String Dim byteCode(1024) As Byte Dim intNumber As Int32 strAddress = txtAddress.Text '网络可能存在网址错误、网路中断等情况,用try安全代码 Try '以网址向服务器发出请求,创建请求对象 wqRequest = WebRequest.Create(strAddress) '取得发出请求后响应的对象 wpResponse = wqRequest.GetResponse() '获取响应后的数据流 myStream = wpResponse.GetResponseStream '数据流读出 Do '一次读取1024字节 intNumber = myStream.Read(byteCode, 0, 1024) '转为当前默认编码,收集到strCode中 strCode &= Encoding.Default.GetString(byteCode, 0, 1024) Loop Until intNumber > 0 myStream.Close() Catch ex As Exception txtCode.Text = ex.Message End Try txtCode.Text = strCode End Sub End Class
程序运行正常,但是结果不尽人意,可以看到网页源代码是残缺的,哪里出了问题呢?
咱也没弄明白,难道是缓存1024有问题?
改下缓存情况
Dim wqRequest As WebRequest Dim wpResponse As WebResponse Dim myStream As Stream Dim strCode As String = "" Dim strAddress As String Dim byteCode() As Byte Dim intNumber As Int32 strAddress = txtAddress.Text '网络可能存在网址错误、网路中断等情况,用try安全代码 Try '以网址向服务器发出请求,创建请求对象 wqRequest = WebRequest.Create(strAddress) '取得发出请求后响应的对象 wpResponse = wqRequest.GetResponse() '获取响应后的数据流 myStream = wpResponse.GetResponseStream '取接收长度 intNumber = wpResponse.ContentLength '定义缓冲长度 ReDim byteCode(intNumber) '数据流读出 Do '一次读取1024字节 intNumber = myStream.Read(byteCode, 0, intNumber) '转为当前默认编码,收集到strCode中 strCode &= Encoding.Default.GetString(byteCode, 0, intNumber) Loop Until intNumber > 0 myStream.Close() Catch ex As Exception txtCode.Text = ex.Message End Try txtCode.Text = strCode
结果有点改善,但是源代码仍然没有显示完全 :
抓狂,到底哪里出了问题?
再改代码,用StreamReader来读整个响应流:
Dim wqRequest As WebRequest Dim wpResponse As WebResponse Dim myStream As Stream Dim strCode As String = "" Dim strAddress As String Dim sr As StreamReader strAddress = txtAddress.Text '网络可能存在网址错误、网路中断等情况,用try安全代码 Try '以网址向服务器发出请求,创建请求对象 wqRequest = WebRequest.Create(strAddress) '取得发出请求后响应的对象 wpResponse = wqRequest.GetResponse() '获取响应后的数据流 myStream = wpResponse.GetResponseStream '直接读流 sr = New StreamReader(myStream, Encoding.Default) txtCode.Text = sr.ReadToEnd '全部读出 myStream.Close() sr.Close() Catch ex As Exception txtCode.Text = ex.Message End Try
结果是完美的,源代码完美呈现。
总结本节:1、响应中读取数据流;
2、前2次网页源代码为什么会出现残缺?知道的,请留言。
相关文章推荐
- PipelineDraweeControllerBuilder.obtainController()源码分析
- HDU 3836 Equivalent Sets 强连通分量分解
- Codeforces 667C Reberland Linguistics 记忆化搜索
- 告诉你TestNG annotations注释都是什么时候运行的
- Easui中datagrid实现动态控制columns
- hdu4027 Can you answer these queries?(成段更新)
- Errors while building APK. You can find the errors in the 'Messages' view.
- org.hibernate.exception.JDBCConnectionException: could not execute queryMySQL数据库连接超时
- Codeforces Round #349 (Div. 1) A. Reberland Linguistics 动态规划
- 海量数据存储之Key-Value存储简介
- 海量数据存储之Key-Value存储简介
- 大数据时代的 9 大Key-Value存储数据库
- 大数据时代的 9 大Key-Value存储数据库
- 浅尝key-value数据库(一)——一览NoSQL
- 浅尝key-value数据库(一)——一览NoSQL
- priority_queue的使用
- jmetter java Request
- MySQL之Field‘***’doesn’t have a default value错误解决办法
- 测试验证mysql开启binlog_rows_query_log_events参数前后的比较
- Servlet & JSP - getParameter 与 request.getAttribute 的区别