zoukankan      html  css  js  c++  java
  • 运用HttpWebRequest与HttpWebResponse获取Web页数据

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(addr);
    // Downloads the XML file from the specified server.
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    System.IO.StreamReader sr 
    = new StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding("gb2312"));
    Console.Write(sr.ReadToEnd());
    sr.Close();
    response.Close();



    1.获取http地址上的图片
    http://www.cnblogs.com/fooo/archive/2007/06/28/798335.html

    HttpWebResponse resp;
            HttpWebRequest req 
    = (HttpWebRequest)HttpWebRequest.Create("http://www.csdn.net/Images/logo_csdn.gif");
            req.Timeout 
    = 150000;
            resp 
    = (HttpWebResponse)req.GetResponse();
            System.Drawing.Image img;
            img 
    = new System.Drawing.Bitmap(resp.GetResponseStream());


    2.

    HttpWebRequest&HttpWebResponse Headers

    介绍

    这里简要介绍如何使用HttpWebRequest&HttpWebResponse两个对象与HTTP服务器进行直接交互的过程.HttpWebRequest类对WebRequest中定义的属性和方法提供支持,在使用HttpWebRequest对象向HTTP服务器发起请求时请不要使用HttpWebRequest对象的构造函数,而应该使用WebRequest.Create()方法来初始化新的HttpWebRequest对象.如果统一资源标识符方案是"http://"或"https://"时,Create()则返回HttpWebResponse对象.

    代码

    首先,我们需要创建一个新的HttpWebRequest对象,代码如下:

    HttpWebRequest myrequest = (HttpWebRequest)WebRequest.Create(newUri("urlstring"));

    注意:上文中已经提到过不要使用HttpWebRequest的构造函数来创建对象;使用WebRequest.Create()方法初始化HttpWebRequest对象时应该对其进行类型转换.

    接下来可以对新初始化的对象进行简单操作,比如可以设置它的标头属性,
    下表列出了由属性或方法设置或由系统设置的标头:



    标头

    设置方法

    Accept 由Accept属性设置
    Connection 由Connection属性和KeepAlive属性设置
    Content-Length 由ContentLength属性设置
    Content-Type 由ContentType属性设置
    Expect 由Expect属性设置
    Date 由系统设置为当前日期
    Host 由系统设置为当前主机信息
    If-Modified-Since 由IfModifiedSince属性设置
    Range 由Range属性设置
    Transfer-Encoding 由TransferEncoding属性设置
    Referer 由Referer属性设置
    User-Agent

    由UserAgent属性设置


    注意:HttpWebRequest自动注册.使用以"http://"或"https://"开头的URL之前,不需要调用RegisterPrefix方法来注册

    System.Net.HttpWebRequest选自:
    MSDN:ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref10/html/T_System_Net_HttpWebRequest.htm

    在完成对服务器的请求之后,我们需要获取从服务器中返回的信息,正如前面提到过的,使用HttpWebResponse类,具体做法参照如下代码:

    HttpWebResponse myresponse = (HttpWebResponse)myrequest.GetResponse();

    同样这里我们需要使用HttpWebResponse进行类型转换.到这里,我们已经成功的获得服务器返回的信息,一个myresponse对象,我们可以利用它来获得更多详细的信息,比如从服务器返回的Headers标头,还有其他的有用信息.而在此我们只给您列出如何获得来自服务器响应的Headers 标头信息.我们的具体方法是这样的:

            #region GetHeaders

            publicstaticWebHeaderCollection GetHeaders(Uri uri)

            {

                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);

                // 省略部分代码......

                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                // 省略部分代码......

                return response.Headers;

            }

            #endregion

    下面就是提供的main()函数:

            // The app entry point

            publicstaticvoid Main(string[] args)

            {

                WebHeaderCollection headers = GetHeaders(newUri("http://www.listim.net"));

                string[] headkeys = headers.AllKeys;

                Console.WriteLine("{0,-30}{1}", "Name", "Value");

                Console.WriteLine("--------------------------------");

                foreach (string s in headkeys)

                {

                    Console.WriteLine("{0,-30}{1}", s, headers[s]);

                }

            }

    以下是该程序显示的效果图:



    3.
    http://blog.csdn.net/Cheaper_c/archive/2004/10/19/142979.aspx

    最近在为公司产品(ASP.NET B/S结构)进行升级的时候遇到了客户的这样一个需求.
        系统提供会议投票这样一种功能,在会议参与者对此次会议所要研究的合同进行研讨之后,系统把参与者的意见(同意,不同意,有条件同意)和意见的详细信息列出,供会议决策者参考,最后由会议决策者输入决策意见.
        其中每一笔合同都包括很多信息,如:法人资料,兄弟公司信息,担保人信息等等,用户迫切需要保存这一系列信息的当前状态.因为这些信息在未来的系统使用过程中可能会发生变更,比如担保人的名称变更等等.
        但是所有的这些信息是由不同的功能结合起来组成的,如果想把这些信息进行汇总,那么重写所有的信息获取方法是不太可行的,所以直接请求页面,从服务器返回的HTML数据流中获取所需内容也许是一个可行的办法.
        首先在程序中维持一个所有信息请求页面地址的列表,然后循环这个列表,进行信息的获取.
        在程序中用到了System.Net, System.IO命名空间.

    public string getPageFromURL(string url)
    {
     string content = "";
     // Create a new HttpWebRequest object.Make sure that
     // a default proxy is set if you are behind a fure wall.
    //其中,HttpWebRequest实例不使用HttpWebRequest的构造函数来创建,二是使用WebRequest的Create方法来创建.
     HttpWebRequest myHttpWebRequest1 =(HttpWebRequest)WebRequest.Create(url);

     //不维持与服务器的请求状态
     myHttpWebRequest1.KeepAlive=false;
    //创建一个HttpWebRequest对象
     //Assign the response object of HttpWebRequest to a HttpWebResponse variable.\
     HttpWebResponse myHttpWebResponse1;
     try
     {
        // 根据微软MSDN上所说:"决不要直接创建HttpWebResponse的实例,要使用HttpWebRequest的GetResponse()方法返回的实例."具体的原因我也不清楚,可能HttpWebResponse类的构造函数中没有实现HttpWebResponse实例的代码吧.
      myHttpWebResponse1 = (HttpWebResponse)myHttpWebRequest1.GetResponse();
      //设置页面的编码模式
      System.Text.Encoding utf8 = System.Text.Encoding.Default;
      Stream streamResponse=myHttpWebResponse1.GetResponseStream();
      StreamReader streamRead = new StreamReader(streamResponse, utf8);

      Char[] readBuff = new Char[256];
        //这里使用了StreamReader的Read()方法,参数意指从0开始读取256个char到readByff中.
        //Read()方法返回值为指定的字符串数组,当达到文件或流的末尾使,方法返回0

      int count = streamRead.Read( readBuff, 0, 256 );
      while (count > 0)
      {
       String outputData = new String(readBuff, 0, count);
       content += outputData;
       count = streamRead.Read(readBuff, 0, 256);
      }
      myHttpWebResponse1.Close();
      return(content);
     }
     catch(WebException ex)
     {
      content = "在请求URL为:" + url + "的页面时产生错误,错误信息为" + ex.ToString();
      return(content);
     }
    }

    2.使用HttpWebRequest、HttpWebResponse获取网页中文乱码解决方案


    我想在程序里面读取一个网页,然后把网页的内容显示出来,开始的时候使用代码如下:
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(addr);
    // Downloads the Xml file from the specified server.
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    System.IO.StreamReader sr = new StreamReader(response.GetResponseStream());
    Console.Write(sr.ReadToEnd());
    sr.Close();
    response.Close();
    的一次测试时返回了数据,测试的使用的是一个e文网站。OK,一切顺利,但是换了一个中文
    网站问题就出来了,中文居然显示是乱码,晕倒,搞了好长时间也没有搞定。后来研究了StreamReader
    类的构造函数,发现有个构造函数是可以指定字符编码格式。好,查文档,HttpWebResponse 中有个
    CharacterSet属性是服务器端文件编码格式,把这个设置进去,代码如下:
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(addr);
    // Downloads the Xml file from the specified server.
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    System.IO.StreamReader sr = new StreamReader(response.GetResponseStream(), response.CharacterSet);
    Console.Write(sr.ReadToEnd());
    sr.Close();
    response.Close();
    嗯,这回不错,用 http://www.qq39.Net 测试一下,居然中文返回的不会乱码了,再用其它的中文网站测试一把。
    我哭,http://www.maitian.cn/mt_fz_center/member/index.asp 这个网址返回的中文居然还是乱码。为什么同样
    是中文网站,返回的数据会不同呢?应该还是CharacterSet属性的问题。跟踪代码,发现能够正确显示中文的网站
    返回的 CharacterSet 属性值是 gb2312,不能正确显示中文的一般是 ISO-8859-1。好,那我就把编码格式都指定
    成 gb2312.代码如下:
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(addr);
    // Downloads the Xml file from the specified server.
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    System.IO.StreamReader sr = new StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding("gb2312"));
    Console.Write(sr.ReadToEnd());
    sr.Close();
    response.Close();

    O, YEAH!这次万事顺利,返回的都是中文,折磨我一天一夜的问题终于解决,心里那个爽呀,嘿嘿。具体的代码如下:
    using System;
    using System.Xml;
    using System.Net;
    using System.IO;

    public class CSharpHttpExample
    {
        public static void Main()
        {
            // Change the Microsoft Inte.Net Information Server (IIS) name in following URL.
            while (true)
            {
                Console.WriteLine("please input url:");
                string addr = Console.ReadLine();

                while (addr.Length == 0)
                {
                    Console.WriteLine("please input url:");
                    addr = Console.ReadLine();
                }

                try
                {
                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(addr); //http://www.qq39.Net http://www.maitian.cn/mt_fz_center/member/index.asp

                    // Change Username and password.
                    //request.Credentials = new.NetworkCredential("[username]", "[password]");

                    // Downloads the Xml file from the specified server.
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                    Console.WriteLine(response.CharacterSet);
                    Console.WriteLine("please input charset:");
                    addr = Console.ReadLine();
                    //System.IO.BufferedStream bf = new BufferedStream(response.GetResponseStream);
                    System.IO.StreamReader sr = new StreamReader(response.GetResponseStream(), System.Text.Encoding.GetEncoding(addr));
                    Console.Write(sr.ReadToEnd());
                    sr.Close();
                    response.Close();
                }
                catch(Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                // Releases the resources of the response.
                Console.Read();
            }
        }
    }

     3.

    如何使用 HttpWebRequest 类和 HttpWebResponse 类来通过 VisualC # 运行 Exchange 2000 服务器计算机上创建约会项目
     
    要在 Visual C#, 是运行 Exchange 2000 计算机上创建约会项目请按照下列步骤:1. 启动 MicrosoftVisualStudio.Net 或 Microsoft Visual Studio 2005。 
    2. 在 文件 菜单, 指向 新建 , 然后单击 项目 。 
    3. 在 VisualC # 项目类型 列表, 单击 控制台应用程序 。

    注意 对于 Visual Studio 2005, 单击 VisualC # 列表中 控制台应用程序 。

    VisualStudio.Net 中, 默认情况下创建 Class 1。 在 Visual Studio 2005, Program.cs 创建默认。

    4. 在代码窗口, 替换为以下代码:
    using System;

    using System.Net;

    using System.IO; 

              

    namespace WebDa.Net

    {   

         /// <summary>

        /// Summary description for Class1.

        /// </summary>

        class Class1

        {

        static void Main(string[] args)

        {

            try

             {

                // TODO: Replace with the URL of an object on Exchange Server

                string sUri = http://ExchServer/Exchange/Administrator/Calendar/testappt.eml

                      System.Uri myUri = new System.Uri(sUri); 

               HttpWebRequest HttpWRequest = (HttpWebRequest)WebRequest.Create(myUri);

                string strXmlNSInfo = "Xmlns:g="DAV:" " +            " Xmlns:e="http://schemas.microsoft.com/exchange/"" +            " Xmlns:mapi="http://schemas.microsoft.com/mapi/"" +            " Xmlns:x="Xml:" Xmlns:cal="urn:schemas:calendar:"" +            " Xmlns:dt="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/"" +            " Xmlns:mail="urn:schemas:httpmail:">"; 

               string sQuery = "<?Xml version="1.0"?>" +            "<g:propertyupdate " + strXmlNSInfo +            "<g:set>" +            "<g:prop>" +            "<g:contentclass>urn:content-classes:appointment</g:contentclass>" +            "<e:outlookmessageclass>IPM.Appointment</e:outlookmessageclass>" +            "<mail:subject>Appointment Subject</mail:subject>" +            "<cal:location>Appointment Location</cal:location>" +            "<cal:dtstart dt:dt="dateTime.tz">2001-12-27T22:00:00.000Z</cal:dtstart>" +            "<cal:dtend dt:dt="dateTime.tz">2001-12-27T22:30:00.000Z</cal:dtend>" +            "<cal:instancetype dt:dt="int">0</cal:instancetype>" +            "<cal:busystatus>BUSY</cal:busystatus>" +            "<cal:meetingstatus>TENTATIVE</cal:meetingstatus>" +            "<cal:alldayevent dt:dt="boolean">0</cal:alldayevent>" +            "</g:prop>" +            "</g:set>" +            "</g:propertyupdate>";

                // Set credentials.

                // TODO: Replace with appropriate user credential

               .NetworkCredential myCred = new.NetworkCredential(@"DomainNameUserName", "UserPassword");

                CredentialCache myCredentialCache = new CredentialCache();

                myCredentialCache.Add(myUri, "Basic", myCred);

                HttpWRequest.Credentials = myCredentialCache; 

               // Set headers.

                HttpWRequest.KeepAlive = false;

                HttpWRequest.Headers.Set("Pragma", "no-cache");

                HttpWRequest.Headers.Set("Translate", "f"); 

               HttpWRequest.ContentType =  "text/Xml";

                HttpWRequest.ContentLength = sQuery.Length;

                //Set the request timeout to 5 minutes.            HttpWRequest.Timeout = 300000;

                // set the request method 

               HttpWRequest.Method = "PROPPATCH";

                            // Store the data in a byte array.            byte[] ByteQuery = System.Text.Encoding.ASCII.GetBytes(sQuery);

                HttpWRequest.ContentLength = ByteQuery.Length;

                Stream QueryStream = HttpWRequest.GetRequestStream();

                // Write the data to be posted to the request stream.

                QueryStream.Write(ByteQuery,0,ByteQuery.Length);

                QueryStream.Close();

                // Send the request and get the response.            HttpWebResponse HttpWResponse = (HttpWebResponse)HttpWRequest.GetResponse();

                // Get the Status code.

                int iStatCode =  (int)HttpWResponse.StatusCode;

                string sStatus = iStatCode.ToString();

                Console.WriteLine("Status Code: {0}", sStatus);

                // Get the request headers

                string sReqHeaders = HttpWRequest.Headers.ToString();

                Console.WriteLine(sReqHeaders);

                // Read the response stream.

                Stream strm = HttpWResponse.GetResponseStream();

                StreamReader sr = new StreamReader(strm);

                string sText = sr.ReadToEnd();

                Console.WriteLine("Response: {0}", sText);

                // Close the stream.

                strm.Close();

                // Clean up 

               myCred = null; 

               myCredentialCache = null; 

               HttpWRequest = null;

                HttpWResponse = null;

                QueryStream = null; 

               strm = null;

                sr = null;

                   }

            catch (Exception e)

            { 

               Console.WriteLine("{0} Exception caught.", e);

            }

          }   

      }

    }
     
    5. 代码, 中搜索 TODO 和然后修改用于环境代码。
    6. 按 F 5 键生成并以运行该程序。
    7. 请确保已创建约会项目

    • HttpWebRequest
        HttpWebRequest 类对 WebRequest 中定义的属性和方法提供支持,也对使用户能够直接与使用 HTTP 的服务器交互的附加属性和方法提供支持。
        使用 System.Net.WebRequest.Create 方法初始化新的 HttpWebRequest 对象。如果统一资源标识符 (URI) 的方案是 http://https://,则 Create 返回 HttpWebRequest 对象。
        GetResponse 方法向 RequestUri 属性中指定的资源发出同步请求并返回包含该响应的 HttpWebResponse。可以使用 BeginGetResponseEndGetResponse 方法对资源发出异步请求。
        当要向资源发送数据时,GetRequestStream 方法返回用于发送数据的 Stream 对象。BeginGetRequestStreamEndGetRequestStream 方法提供对发送数据流的异步访问。
        对于使用 HttpWebRequest 的客户端验证身份,客户端证书必须安装在当前用户的“我的证书”存储区中。
        如果在访问资源时发生错误,则 HttpWebRequest 类将引发 WebExceptionWebException.Status 属性包含指示错误源的 WebExceptionStatus 值。当 WebException.Status 为 WebExceptionStatus.ProtocolError 时,Response 属性包含从资源接收的 HttpWebResponse
        HttpWebRequest
      将发送到 Internet 资源的公共 HTTP 标头值公开为属性,由方法或系统设置;下表包含完整列表。可以将 Headers 属性中的其他标头设置为名称/值对。注意,服务器和缓存在请求期间可能会更改或添加标头。
    • HttpWebResponse
        此类包含对 WebResponse 类中的属性和方法的 HTTP 特定用法的支持。HttpWebResponse 类用于生成发送 HTTP 请求和接收 HTTP 响应的 HTTP 独立客户端应用程序。
        决不要直接创建 HttpWebResponse 类的实例。而应当使用通过调用 HttpWebRequest.GetResponse 所返回的实例。您必须调用 Stream.Close 方法或 HttpWebResponse.Close 方法来关闭响应并将连接释放出来供重用。不必同时调用 Stream.CloseHttpWebResponse.Close,但这样做不会导致错误。
        从 Internet 资源返回的公共标头信息公开为该类的属性。有关完整的列表,请参见下表。可以从 Headers 属性以名称/值对的形式读取其他标头。





    关键代码:

    Imports System.Net
    Imports System.IO
    Imports System.Text.RegularExpressions
    Partial 
    Class Default4
        
    Inherits System.Web.UI.Page
        
    '获取Web页上的数据
        Protected Sub btn_GetResponse_Click(ByVal sender As ObjectByVal e As System.EventArgs) Handles btn_GetResponse.Click
            
    Dim strURL As String = String.Empty
            
    Dim strResult As String = String.Empty
            
    Dim hwr As HttpWebRequest = Nothing
            
    Dim hws As HttpWebResponse = Nothing
            
    If Me.CheckURL(Me.txtURL.Text, strURL) Then
                hwr 
    = HttpWebRequest.Create(strURL)
                hwr.Method 
    = "Get"
                hws 
    = hwr.GetResponse
                
    '为避免乱码,对数据流进行了gb2312编码
                Using sr As StreamReader = New StreamReader(hws.GetResponseStream, Encoding.GetEncoding("gb2312"))
                    
    Me.txtResult.Text = sr.ReadToEnd.Trim
                
    End Using
            
    Else
                
    Me.Label_CheckedResult.Text = "无效的URL"
            
    End If
        
    End Sub


        
    '该例程主要是用来匹配输入的URL是否符合标准
        Private Function CheckURL(ByVal url As StringByRef URLReturnValue As StringAs Boolean
            
    If Regex.IsMatch(url.Trim, "http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?"Then
                URLReturnValue 
    = url.Trim
                
    Return True
            
    Else
                URLReturnValue 
    = String.Empty
                
    Return False
            
    End If
        
    End Function


        
    '该例程主要检查输入的URL指向的站点是否可用
        Protected Sub btn_CheckURLActive_Click(ByVal sender As ObjectByVal e As System.EventArgs) Handles btn_CheckURLActive.Click
            
    Dim strURL As String = String.Empty
            
    Dim strResult As String = String.Empty
            
    Dim hwr As HttpWebRequest = Nothing
            
    Dim hws As HttpWebResponse = Nothing
            
    If Me.CheckURL(Me.txtURL.Text, strURL) Then
                
    Try
                    hwr 
    = HttpWebRequest.Create(strURL)
                    hwr.Method 
    = "HEAD"
                    hwr.Timeout 
    = 100
                    hws 
    = hwr.GetResponse
                    
    If hws.StatusCode = HttpStatusCode.OK Then
                        
    Me.Label_CheckedResult.Text = "您输入的URL可以用"
                        
    Me.btn_GetResponse.Enabled = True
                    
    Else
                        
    Me.Label_CheckedResult.Text = "您输入的URL不可用"
                        
    Me.btn_GetResponse.Enabled = False
                    
    End If
                
    Catch ex As Exception
                    
    Me.Label_CheckedResult.Text = "发生错误,信息如下:" & ex.Message
                
    End Try
            
    Else
                
    Me.Label_CheckedResult.Text = "无效的URL"
            
    End If
        
    End Sub

    End Class

  • 相关阅读:
    SharePoint 2013 开启訪问请求
    鸟哥Linux私房菜知识点总结3到5章
    火狐浏览器中加入httprequest的方法
    xhprof安装&amp;&amp;使用
    第一篇、Android Supersu 权限管理定制,隐藏过滤权限,指定APP最高权限
    Android 推断程序在手机中是否是活动状态或者正在执行状态
    【Java并发编程实战】—–synchronized
    24岁菜鸟,能一个人撑起App开发吗
    技术与经济之八:关于优惠与红包
    关于notepad++如何自动补全标签的问题
  • 原文地址:https://www.cnblogs.com/zpc870921/p/2643253.html
Copyright © 2011-2022 走看看