还是编码,HttpWebRequest

本文探讨了在使用HttpWebRequest进行网页抓取时,不同的编码格式如何影响抓取结果。通过实例说明了当编码格式与服务器不一致时,无法获取正确数据的问题,并给出了解决方案。

在用HttpWebRequest抓取信息的时候,比如说抓去百度的信息,

那么代码如下:

string  url  =   string .Format(  " http://www.baidu.com/s?wd={0} " ,HttpUtility.UrlEncode( " 电脑 " ));

 

这个时候,系统默认的编码格式是UTF8,那么其发送到浏览器的请求是:

http://www.baidu.com/s?wd=%e5%a4%a9%e6%9%c%ba

如果使用

string  url  =   string .Format(  " http://www.baidu.com/s?wd={0} " ,HttpUtility.UrlEncode( " 电脑 " ,Encoding.Default));

那么,当前编码格式一般是GB2312,那么发送到浏览器请求的是:

http://www.baidu.com/s?wd=%cc%ec%bb%fa

这两个请求的显示内容是不一样的,因为百度所采取的编码格式是gb2312,所以采用后一种方式才能获取到正确的结果。

因此,在做这种抓取的请求的时候,一定要请求的数据必须与服务器的编码格式一致,否则将不能返回正确的数据。

转载于:https://www.cnblogs.com/land/archive/2009/04/21/1440504.html

<think>好的,用户想了解如何在C#中使用HttpWebRequest类,特别是需要示例。我需要根据提供的三个引用内容来组织回答,确保结构清晰,并且符合用户的要求。 首先,用户的问题是关于HttpWebRequest的使用方法,所以应该分步骤讲解,比如GET和POST请求。引用1中的代码展示了GET请求的处理,而引用2和3则涉及POST请求的不同情况,比如发送字符串、表单数据和文件。需要将这些代码示例整理成易懂的步骤,并解释关键部分。 接下来,要注意用户可能需要了解异步操作,因为在实际应用中,网络请求通常需要异步处理以避免阻塞主线程。引用中没有直接提到异步方法,但根据经验,HttpWebRequest有BeginGetResponse等方法,或者可以使用async/await,需要补充这部分内容。 另外,异常处理也是关键点,用户需要知道如何处理网络请求中可能出现的错误。引用中的代码都有try-catch块,但可以更详细地说明常见的异常类型和处理方法。 然后,根据用户提供的引用,特别是引用3,提到了HTTPS请求的设置,可能需要解释如何配置证书验证,比如ServicePointManager.ServerCertificateValidationCallback,这部分需要详细说明,因为HTTPS请求的安全设置很重要。 用户还希望生成相关问题,可能需要包括GET和POST的区别、异常处理、异步方法、HTTPS配置等。这些问题应该围绕用户可能遇到的后续疑问展开。 需要检查每个代码示例是否符合C#的最佳实践,比如使用using语句来确保资源释放,编码方式是否正确处理,特别是引用3中的编码可能有问题,应该建议使用UTF-8而不是默认编码。 最后,确保回答结构清晰,分点列出,每个步骤有代码示例和解释,并且语言简洁明了。同时,引用标识要正确对应,例如引用1对应GET方法,引用2和3对应POST的不同情况。</think>### C#中HttpWebRequest类的使用方法详解 HttpWebRequest是.NET Framework中用于处理HTTP请求的核心类,支持GET、POST等多种请求方式。以下是关键使用步骤和示例: 一、GET请求获取网页内容 ```csharp public static string GetUrl(string url, string encodingType) { try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); using HttpWebResponse response = (HttpWebResponse)request.GetResponse(); using Stream respStream = response.GetResponseStream(); using StreamReader reader = new StreamReader(respStream, Encoding.GetEncoding(encodingType)); return reader.ReadToEnd(); } catch (WebException ex) { // 处理网络异常 } return ""; } ``` * 特点:自动处理响应流编码 * 注意:使用using确保资源释放[^1] 二、POST请求发送数据 1. 发送表单数据 ```csharp public string PostFormData(string url, string postData) { byte[] buffer = Encoding.UTF8.GetBytes(postData); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = buffer.Length; using (Stream reqStream = request.GetRequestStream()) { reqStream.Write(buffer, 0, buffer.Length); } using HttpWebResponse response = (HttpWebResponse)request.GetResponse(); using StreamReader reader = new StreamReader(response.GetResponseStream()); return reader.ReadToEnd(); } ``` * 关键设置:ContentType和ContentLength[^3] 2. 发送文件(multipart/form-data) ```csharp public string UploadFile(string url, string filePath) { string boundary = "----" + DateTime.Now.Ticks.ToString("x"); byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n"); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.ContentType = "multipart/form-data; boundary=" + boundary; request.Method = "POST"; using (Stream reqStream = request.GetRequestStream()) { // 写入文件头 string header = $"Content-Disposition: form-data; name=\"file\"; filename=\"{Path.GetFileName(filePath)}\"\r\nContent-Type: application/octet-stream\r\n\r\n"; reqStream.Write(boundaryBytes, 0, boundaryBytes.Length); reqStream.Write(Encoding.UTF8.GetBytes(header), 0, Encoding.UTF8.GetBytes(header).Length); // 写入文件内容 byte[] fileBytes = File.ReadAllBytes(filePath); reqStream.Write(fileBytes, 0, fileBytes.Length); // 写入结束边界 byte[] endBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n"); reqStream.Write(endBytes, 0, endBytes.Length); } using HttpWebResponse response = (HttpWebResponse)request.GetResponse(); using StreamReader reader = new StreamReader(response.GetResponseStream()); return reader.ReadToEnd(); } ``` 三、高级配置 1. Cookie处理 ```csharp CookieContainer cookieContainer = new CookieContainer(); void SetCookies(HttpWebRequest request, string url) { request.CookieContainer = cookieContainer; // 自动管理Cookie会话 } ``` * 特点:支持跨请求保持会话状态[^2] 2. HTTPS证书验证(绕过SSL验证) ```csharp ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true; ``` * 警告:生产环境应使用正规证书验证 四、异步请求实现 ```csharp public async Task<string> GetAsync(string url) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); using WebResponse response = await request.GetResponseAsync(); using Stream stream = response.GetResponseStream(); using StreamReader reader = new StreamReader(stream); return await reader.ReadToEndAsync(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值