C# 网络编程-关于HttpWebRequest使用方式(二)

项目开发用到数据请求时候,会用的到HttpWebRequest的请求方式,主要涵盖GET、POST、PUT、DELETE等方法

一、HttpWebRequest简介

HttpWebRequest是.NET Framework中用于发送HTTP请求的核心类,适用于构建HTTP客户端。它支持GET、POST、PUT、DELETE等HTTP方法,但代码相对底层,需要手动处理请求和响应的生命周期。在.NET Core及后续版本中,推荐使用HttpClient替代,但本文重点讲解HttpWebRequest


二、常用请求方式

1. GET请求(获取资源)

用途:从服务器获取数据(如查询API)。

步骤

  1. 创建HttpWebRequest实例。
  2. 设置MethodGET
  3. 发送请求并获取响应。
  4. 读取响应内容。

示例代码

using System;
using System.IO;
using System.Net;public class HttpGetExample
{public static void Main(){string url = "https://api.example.com/data";try{// 1. 创建请求HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);request.Method = "GET";// 2. 发送请求并获取响应using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()){// 3. 读取响应内容using (Stream responseStream = response.GetResponseStream())using (StreamReader reader = new StreamReader(responseStream)){string result = reader.ReadToEnd();Console.WriteLine("Response: " + result);}}}catch (WebException ex){// 异常处理HandleWebException(ex);}}
}

2. POST请求(提交数据)

用途:向服务器提交数据(如表单提交、创建资源)。

步骤

  1. 创建请求并设置MethodPOST
  2. 设置请求头(如Content-Type)。
  3. 写入请求体数据。
  4. 发送请求并处理响应。

示例代码

public class HttpPostExample
{public static void Main(){string url = "https://api.example.com/submit";string postData = "username=John&password=123456"; // 表单数据try{// 1. 创建请求HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);request.Method = "POST";request.ContentType = "application/x-www-form-urlencoded"; // 设置内容类型// 2. 写入请求体using (Stream requestStream = request.GetRequestStream())using (StreamWriter writer = new StreamWriter(requestStream)){writer.Write(postData);}// 3. 发送请求并处理响应using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())using (StreamReader reader = new StreamReader(response.GetResponseStream())){string result = reader.ReadToEnd();Console.WriteLine("Response: " + result);}}catch (WebException ex){HandleWebException(ex);}}
}

3. PUT请求(更新资源)

用途:更新服务器上的现有资源(类似POST但用于更新)。

步骤

  1. 设置MethodPUT
  2. 写入请求体(如JSON或表单数据)。

示例代码

public class HttpPutExample
{public static void Main(){string url = "https://api.example.com/update/123";string jsonBody = "{\"name\": \"New Name\"}";try{HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);request.Method = "PUT";request.ContentType = "application/json";using (Stream requestStream = request.GetRequestStream())using (StreamWriter writer = new StreamWriter(requestStream)){writer.Write(jsonBody);}using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()){Console.WriteLine($"Status Code: {response.StatusCode}");}}catch (WebException ex){HandleWebException(ex);}}
}

4. DELETE请求(删除资源)

用途:删除服务器上的资源。

步骤

  1. 设置MethodDELETE
  2. 通常不需要请求体,但可以添加查询参数。

示例代码

public class HttpDeleteExample
{public static void Main(){string url = "https://api.example.com/delete/456";try{HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);request.Method = "DELETE";using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()){Console.WriteLine($"Status Code: {response.StatusCode}");}}catch (WebException ex){HandleWebException(ex);}}
}

三、其他常见配置

1. 设置超时
request.Timeout = 5000; // 5秒超时
request.ReadWriteTimeout = 5000; // 读写超时
2. 处理Cookie
// 获取响应中的Cookie
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;// 或者从响应头提取Cookie
foreach (Cookie cookie in response.Cookies)
{Console.WriteLine($"Cookie: {cookie.Name} = {cookie.Value}");
}
3. 设置代理
request.Proxy = new WebProxy("http://proxy.example.com:8080");
4. 处理SSL证书问题(测试环境使用)
ServicePointManager.ServerCertificateValidationCallback +=(sender, certificate, chain, sslPolicyErrors) => true;

四、异步请求

HttpWebRequest支持异步操作,避免阻塞主线程:

public async Task MakeAsyncRequest()
{HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api.example.com");request.Method = "GET";using (HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync())using (Stream stream = response.GetResponseStream())using (StreamReader reader = new StreamReader(stream)){string result = await reader.ReadToEndAsync();Console.WriteLine(result);}
}

五、错误处理与异常管理

HttpWebRequest通过WebException抛出异常:

private static void HandleWebException(WebException ex)
{if (ex.Response != null){using (HttpWebResponse errorResponse = (HttpWebResponse)ex.Response){Console.WriteLine($"Error Status Code: {errorResponse.StatusCode}");using (Stream stream = errorResponse.GetResponseStream())using (StreamReader reader = new StreamReader(stream)){Console.WriteLine("Error Response: " + reader.ReadToEnd());}}}else{Console.WriteLine($"Network Error: {ex.Message}");}
}

六、注意事项

  1. 资源释放:始终使用using语句确保WebResponseStream正确释放。
  2. 安全性:避免在生产环境忽略SSL证书验证(ServerCertificateValidationCallback)。
  3. 替代方案:在.NET Core中推荐使用HttpClient,它更简洁且支持异步操作。
  4. 性能:频繁请求时,考虑复用HttpClientHttpWebRequest需手动管理连接池)。

七、总结

HttpWebRequest是.NET中实现HTTP客户端的基础类,适合需要精细控制请求和响应的场景。但需注意其底层特性及潜在的资源管理问题。对于现代应用,建议优先使用HttpClient,它提供了更简洁的API和更好的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88336.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88336.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git变更记录

目录 wvp-ui -new Dji 10.60.2.175:8000上的编译 个人拉分支 目前约定2025-06-25 wvp-ui -new branch new BASE_URL /new/ ci-cd : wvp-newui Config [Jenkins] 禁 用 10.30.2.8 ssh 10.30.2.8 /home/dualven/wvp-server/deployNewUi.sh Dji 主分支的构建&#xf…

前端如何禁止用户复制?

禁用右键菜单 document.addEventListener(contextmenu, function(e) {e.preventDefault(); });禁用快捷键(CtrlC/X/A等) document.addEventListener(keydown, function(e) {if (e.ctrlKey && [c, x, v, a].includes(e.key.toLowerCase())) {e.…

阿里云无影:开启云端办公娱乐新时代

阿里云无影云电脑:打破传统束缚,畅享云端自由 在数字化浪潮汹涌澎湃的当下,云计算技术持续革新,为我们的工作与生活带来前所未有的变革。阿里云作为云计算领域的佼佼者,推出的无影云电脑无疑是一颗璀璨的明星&#xf…

Windows 和 macOS 串口调试软件

在 Windows 和 macOS 上,你可以使用以下串口调试软件来查看开发板的打印信息。以下是常见且好用的工具推荐: Windows 推荐工具 PuTTY 免费、轻量级,支持串口(COM)和 SSH/Telnet下载地址:https://www.putty.…

Redis 的作用及详细分析

网上查询总结了一下Redis相关的信息 记录一下 ,有问题的地方,望多加指正,我们共同学习。 什么是Redis Redis是一款内存高速缓存数据库。Redis全称为:Remote Dictionary Server (远程数据服务),…

【边缘计算】引论基础

(1)在不远的未来,将有超过50%的数据需要在网络边缘侧分析、处理与储存。智能互联的网络边缘侧将会面临如下挑战: 联接设备的海量与异构 随着联接设备数量的剧增,网络运维管理、灵活扩展和可靠性保障都面临着巨大挑战。…

SpringBoot中4种登录验证码实现方案

文章目录 详解方案一:基于kaptcha的图形验证码实现步骤 方案二:基于短信验证码实现步骤 方案三:基于Spring Mail的邮箱验证码实现步骤 方案四:基于AJ-Captcha的滑动拼图验证码实现步骤 总结 详解 在Web应用中,验证码是…

基于版本控制+WORM的OSS数据保护:防勒索攻击与法规遵从实践

1. 数据保护的核心挑战与解决方案架构 (1)现代数据保护的三大矛盾 勒索软件进化 vs 传统备份脆弱性:攻击者已掌握备份系统删除技术(如vssadmin delete shadows)法规保留要求(GDPR第17条)vs 技…

混合架构入门:如何选组合恰当的云 + 私有节点?

如果你最近刚开始搭建业务系统,或者准备从传统IDC迁移到云上,你很可能已经被“混合云”、“多云”、“私有部署”这些概念绕得头晕。而今天这篇文章,不会再罗列概念或抄定义,而是站在一个运维工程师、架构规划者的角度&#xff0c…

CDN+OSS边缘加速实践:动态压缩+智能路由降低30%视频流量成本(含带宽峰值监控与告警配置)

1 背景与挑战分析 (1)流量成本结构剖析 视频业务带宽成本公式: C_{total} \sum_{i1}^{n} (P_{peak_i} T_i R_{region}) C_{req} N_{req}其中 P p e a k P_{peak} Ppeak​ 为区域峰值带宽(GB/s), T …

Flink内存配置

通过本文可以解决以下3个问题。 了解flink内存和配置项相关概念。清楚UI中TM和JM各内存组件实际内存值的计算规则。根据实际情况对内存进行调整。 1. Flink进程内存 TM和JM二者均为JVM进程(JVM通常分成堆内和堆外两部分)。TM和JM的内存定义为进程总内…

最新发布 | “龙跃”(MindLoongGPT)大模型正式发布!龙跃而起,推动中国方案走向全球智能体前沿

在人工智能快速演进的今天,生成式大模型正成为推动技术变革的核心引擎。继语言、图像、视频等领域实现突破之后,下一阶段的技术焦点,正加速向“具身智能”迁移。具身智能强调智能体对物理世界的感知、理解与互动能力,是实现通用人…

【系统分析师】2019年真题:论文及解题思路

文章目录 试题一 论系统需求分析方法试题二 论系统自动化测试及其应用试题三 论处理流程设计方法及应用试题四 论企业智能运维技术与方法 试题一 论系统需求分析方法 系统需求分析是开发人员经过调研和分析,准确理解用户和项目 的功能、性能、可靠 性等要求&#x…

在PHP环境下使用SQL Server的方法

当您处在PHP环境并想使用SQL Server作为数据库服务器时,您需要将SQL Server连接到PHP。这涉及到一些步骤,我们会逐一说明并提供示例以指导你。 1.安装SQL Server驱动: 首先,您需要在PHP环境中安装对应的SQL Server驱动&#xff0…

RISC-V h拓展

https://tinylab.org/riscv-kvm-virt-mode-switch/ https://tinylab.org/riscv-kvm-virt-trap/ 特权模式 指令集中约定用虚拟化模式 V (virtualization mode) 来标记当前是否是在 Guest 系统中运行。V1 表示当前确实运行在 Guest 系统中,V0 则表示不运行在 Guest 中…

HCIA-华为VRP系统基础

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 本篇笔记是根据B站上的视频教程整理而成,感谢UP主的精彩讲解!如果需要了解更多细节,可以参考以下视频:…

OSS大数据分析集成:MaxCompute直读OSS外部表优化查询性能(减少数据迁移的ETL成本)

(1)数据存储与分析分离的痛点 传统架构中,OSS作为廉价存储常与MaxCompute计算引擎分离,导致ETL迁移成本高企。某电商案例显示:每日300TB日志从OSS导入MaxCompute内部表,产生以下问题: 延迟&…

vue | vue-macros 插件升级以及配置

Vue Macros 是一个为 Vue.js 提供更多宏和语法糖的开源项目vue-macros/vue-macros: Explore and extend more macros and syntax sugar to Vue. 问题:npm run build-only 打包时,报错:[Vue] Load plugin failed: vue-macros/volar 排查发现…

瑞芯微elf2开发板(rk3588)实现ros2humble下部署yolov5模型与Astrapro相机集成实现目标检测

版本信息总结以及工具介绍 组件版本说明RKNN Lite2.1.0嵌入式端推理库RKNN Runtime2.1.0运行时库 (967d001cc8)RKNN Driver0.9.8NPU驱动程序模型版本6RKNN模型格式版本工具链版本2.1.0708089d1模型转换工具链Python3.10编程语言OpenCV4.x图像处理库目标平台rk3588Rockchip RK3…

Web前端入门:JavaScript 事件循环机制中的微任务与宏任务

JS 是单线程语言。这句话对不对? 按照目前的情况来看,JS 自从支持了 Web Worker 之后,就不再是单线程语言了,但 Worker 的工作线程与主线程有区别,在 Worker 的工作线程中无法直接操作 DOM、window 对象或大多数浏览器…