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
英文地址,請注明出處:http://en.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 對象或大多數瀏覽器…