.NET 透過 HttpWebRequest(繼承自 WebRequest)與 HttpWebResponse 實現 HTTP 通訊。注意:HttpWebRequest 建構子為 protected,必須透過 WebRequest.Create() 工廠方法建立實例。
string uri = "https://www.baidu.com";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "GET";
request.ProtocolVersion = new Version(1, 1);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
// 讀取回應 Header
foreach (string key in response.Headers) {
Console.WriteLine($"{key}: {response.GetResponseHeader(key)}");
}
// 讀取回應 Body
if (response.ContentLength > 0) {
using (Stream stream = response.GetResponseStream()) {
byte[] buffer = new byte[response.ContentLength + 1024];
int totalRead = 0;
while (totalRead < response.ContentLength) {
int read = stream.Read(buffer, totalRead, 1024);
if (read == 0) break;
totalRead += read;
}
string html = Encoding.UTF8.GetString(buffer, 0, totalRead);
Console.WriteLine(html);
}
}
string imgUrl = "https://example.com/photo.jpg";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(imgUrl);
req.Method = "GET";
using (HttpWebResponse resp = (HttpWebResponse)req.GetResponse())
using (Stream respStream = resp.GetResponseStream())
using (FileStream fs = new FileStream($"img_{DateTime.Now:yyyyMMddHHmmss}.jpg", FileMode.Create)) {
respStream.CopyTo(fs); // .NET 4.0+ 直接複製流
}
WebRequest.Create(uri) → 轉型 HttpWebRequest。GetResponse() → 轉型 HttpWebResponse。response.Headers 集合。GetResponseStream() 取得 Stream,再讀取或複製。using 確保連線與流正確關閉。.NET Core / .NET 5+ 建議使用 HttpClient,支援非同步、連線池、更簡潔的 API:
using var client = new HttpClient();
string html = await client.GetStringAsync("https://www.baidu.com");
byte[] imgBytes = await client.GetByteArrayAsync(imgUrl);
await File.WriteAllBytesAsync("photo.jpg", imgBytes);