🔎 유용한 정보
1. 강의 개요
이번 강의에서는 HttpClient를 사용해 비동기 네트워크 요청을 처리하는 방법을 배웁니다.
RESTful API를 호출하여 데이터를 가져오거나 서버에 데이터를 전송하는 기능을 구현하며,
UI를 통해 요청 및 응답 데이터를 확인할 수 있는 간단한 HTTP 클라이언트 애플리케이션을 만들어봅니다.
2. 학습 목표
- HttpClient를 사용한 GET/POST 요청 구현
- 비동기 요청 처리로 UI 응답성 유지
- JSON 응답 데이터를 파싱하여 DataGridView에 표시
- POST 요청으로 데이터를 서버에 전송
3. 기능 요구사항
필수 기능
1️⃣ GET 요청:
- RESTful API로 데이터를 요청하고 결과를 JSON 형식으로 표시
2️⃣ POST 요청:
- 사용자가 입력한 데이터를 API에 POST 방식으로 전송
3️⃣ JSON 데이터 표시:
- GET 요청의 응답 데이터를 DataGridView에 표시
4️⃣ UI 응답성 유지:
- 비동기 요청 처리로 요청 중에도 UI 작업 가능
4. 실습: 비동기 HTTP 클라이언트 제작
1️⃣ 폼 구성
- 폼(Form) 이름: Form1
- 컨트롤 배치
컨트롤 타입 이름 위치 크기
TextBox | txtApiUrl | 폼 상단 왼쪽 | (300 x 30) |
Button | btnSendGet | 폼 상단 중앙 | (100 x 30) |
DataGridView | dgvData | 폼 중앙 | (500 x 300) |
TextBox | txtPostData | 폼 하단 왼쪽 | (300 x 60) |
Button | btnSendPost | 폼 하단 오른쪽 | (100 x 60) |
📌 폼 디자인 예시:
--------------------------------------------------
| [API URL: TextBox] [Send GET 버튼] |
--------------------------------------------------
| [DataGridView - JSON 데이터 표시] |
--------------------------------------------------
| [POST 데이터: TextBox] [Send POST 버튼] |
--------------------------------------------------
2️⃣ 코드 작성
(1) HttpClient를 사용한 GET 요청
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text.Json;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp_HttpClient
{
public partial class Form1 : Form
{
private readonly HttpClient _httpClient;
public Form1()
{
InitializeComponent();
_httpClient = new HttpClient(); // HttpClient 초기화
}
// GET 요청 처리
private async void btnSendGet_Click(object sender, EventArgs e)
{
string apiUrl = txtApiUrl.Text.Trim();
if (string.IsNullOrEmpty(apiUrl))
{
MessageBox.Show("API URL을 입력하세요.", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
try
{
string jsonResponse = await _httpClient.GetStringAsync(apiUrl); // GET 요청
// JSON 응답 데이터 파싱
var data = JsonSerializer.Deserialize<List<Dictionary<string, object>>>(jsonResponse);
// DataGridView에 데이터 바인딩
dgvData.DataSource = data;
}
catch (Exception ex)
{
MessageBox.Show($"GET 요청 실패: {ex.Message}", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
(2) HttpClient를 사용한 POST 요청
// POST 요청 처리
private async void btnSendPost_Click(object sender, EventArgs e)
{
string apiUrl = txtApiUrl.Text.Trim();
string postData = txtPostData.Text.Trim();
if (string.IsNullOrEmpty(apiUrl) || string.IsNullOrEmpty(postData))
{
MessageBox.Show("API URL과 POST 데이터를 입력하세요.", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
try
{
var content = new StringContent(postData, System.Text.Encoding.UTF8, "application/json"); // JSON 형식으로 데이터 변환
HttpResponseMessage response = await _httpClient.PostAsync(apiUrl, content); // POST 요청
response.EnsureSuccessStatusCode(); // 요청 성공 여부 확인
string responseData = await response.Content.ReadAsStringAsync(); // 응답 데이터 읽기
MessageBox.Show($"POST 요청 성공: {responseData}", "성공", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show($"POST 요청 실패: {ex.Message}", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
(3) Designer 코드
private void InitializeComponent()
{
this.txtApiUrl = new TextBox();
this.btnSendGet = new Button();
this.dgvData = new DataGridView();
this.txtPostData = new TextBox();
this.btnSendPost = new Button();
// API URL TextBox 설정
this.txtApiUrl.Location = new System.Drawing.Point(10, 10);
this.txtApiUrl.Size = new System.Drawing.Size(300, 30);
// Send GET Button 설정
this.btnSendGet.Location = new System.Drawing.Point(320, 10);
this.btnSendGet.Size = new System.Drawing.Size(100, 30);
this.btnSendGet.Text = "Send GET";
this.btnSendGet.Click += new EventHandler(this.btnSendGet_Click);
// DataGridView 설정
this.dgvData.Location = new System.Drawing.Point(10, 50);
this.dgvData.Size = new System.Drawing.Size(500, 300);
// POST 데이터 TextBox 설정
this.txtPostData.Location = new System.Drawing.Point(10, 360);
this.txtPostData.Size = new System.Drawing.Size(300, 60);
this.txtPostData.Multiline = true;
// Send POST Button 설정
this.btnSendPost.Location = new System.Drawing.Point(320, 360);
this.btnSendPost.Size = new System.Drawing.Size(100, 60);
this.btnSendPost.Text = "Send POST";
this.btnSendPost.Click += new EventHandler(this.btnSendPost_Click);
// Form 설정
this.ClientSize = new System.Drawing.Size(520, 450);
this.Controls.Add(this.txtApiUrl);
this.Controls.Add(this.btnSendGet);
this.Controls.Add(this.dgvData);
this.Controls.Add(this.txtPostData);
this.Controls.Add(this.btnSendPost);
this.Text = "HTTP 클라이언트 애플리케이션";
}
3️⃣ 실행 결과
1️⃣ GET 요청
- API URL 입력 후 "Send GET" 클릭 → JSON 응답 데이터를 DataGridView에 표시
2️⃣ POST 요청
- API URL과 POST 데이터 입력 후 "Send POST" 클릭 → 서버로 데이터 전송 및 응답 확인
3️⃣ UI 응답성 유지
- 요청 중에도 다른 UI 작업 가능
5. 주요 개념 요약
- HttpClient: HTTP 요청 및 응답 처리를 위한 클래스
- async/await: 비동기 작업 구현을 위한 키워드
- JSON 데이터 파싱: System.Text.Json을 사용한 JSON 직렬화/역직렬화
- StringContent: POST 요청 데이터 변환
📌 #CSharp #WindowsForms #HttpClient #RESTfulAPI #GET요청 #POST요청 #JSON파싱
'📁 [4] 개발자 정보 & 코드 노트 > C#' 카테고리의 다른 글
C# Windows Forms 강의 73편: SignalR 클라이언트를 활용한 실시간 채팅 애플리케이션 제작 (0) | 2025.04.16 |
---|---|
C# Windows Forms 강의 72편: WebSocket을 활용한 실시간 양방향 통신 (0) | 2025.04.15 |
C# Windows Forms 강의 70편: Task와 BackgroundWorker를 활용한 비동기 파일 처리 (0) | 2025.04.13 |
C# Windows Forms 강의 69편: 파일 탐색기 애플리케이션 제작 (TreeView와 ListView 활용) (0) | 2025.04.12 |
C# Windows Forms 강의 67편: CSV 데이터를 읽고 쓰기 - 테이블 형식 데이터 관리 (0) | 2025.04.11 |
🔎 유용한 정보