การใช้ WebClient สำหรับส่งข้อมูลแบบ POST
WebClient (อยู่ใน System.Net) เป็นคลาสที่ใช้งานง่ายสำหรับส่งและรับข้อมูลจาก Web API รองรับทั้ง GET และ POST แม้ว่าใน .NET Core/5+ จะแนะนำให้ใช้ HttpClient แทน แต่ WebClient ยังคงใช้งานได้และเข้าใจง่าย
เมธอดสำคัญ: UploadString
UploadString(url, data) - ส่งสตริงไปยังทรัพยากรและคืนค่าตอบกลับเป็นสตริง
ตัวอย่างเต็ม: POST JSON ไปยัง JSONPlaceholder API
using System;
using System.Net;
using Newtonsoft.Json;
class Program
{
public static void Main()
{
var user = new User
{
id = 1,
title = "First Data",
body = "First Body",
userId = 222
};
try
{
using (WebClient webClient = new WebClient())
{
webClient.BaseAddress = "https://jsonplaceholder.typicode.com";
var url = "/posts";
// ตั้งค่า Header
webClient.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
webClient.Headers[HttpRequestHeader.ContentType] = "application/json";
// Serialize object เป็น JSON
string data = JsonConvert.SerializeObject(user);
// ส่ง POST request
var response = webClient.UploadString(url, data);
// Deserialize response
var result = JsonConvert.DeserializeObject<object>(response);
Console.WriteLine(result);
}
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
// ใน production ควร log error แทนการ throw ใหม่
}
}
}
class User
{
public int id { get; set; }
public string title { get; set; }
public string body { get; set; }
public int userId { get; set; }
}
ผลลัพธ์:
{
"id": 101,
"title": "First Data",
"body": "First Body",
"userId": 222
}
เมธอด Upload อื่นๆ ของ WebClient
| เมธอด | คำอธิบาย |
|---|---|
UploadData | ส่ง byte array |
UploadFile | อัปโหลดไฟล์ |
UploadValues | ส่ง NameValueCollection (form data) |
UploadStringAsync | เวอร์ชัน async ของ UploadString |
ข้อควรระวังและแนวทางปฏิบัติที่ดี
- ใช้ using statement เพื่อให้ Dispose อัตโนมัติ
- ตั้งค่า Content-Type header ให้ถูกต้อง (application/json, application/x-www-form-urlencoded, multipart/form-data)
- จัดการ Exception เช่น WebException, TimeoutException
- ใน .NET Core/5+ แนะนำ HttpClient ซึ่งมีประสิทธิภาพดีกว่า รองรับ DI และไม่มีปัญหา socket exhaustion
ตัวอย่างเปรียบเทียบกับ HttpClient (แนะนำสำหรับโปรเจกต์ใหม่)
using (var httpClient = new HttpClient())
{
httpClient.BaseAddress = new Uri("https://jsonplaceholder.typicode.com/");
httpClient.DefaultRequestHeaders.Add("User-Agent", "MyApp");
var json = JsonConvert.SerializeObject(user);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync("posts", content);
var result = await response.Content.ReadAsStringAsync();
}