C# HTTP로 JSON 데이터 받기 : HttpClient 의 활용

소개

C# 웹 기반 애플리케이션을 작업할 때 HTTP 요청을 통해 API와 상호 작용이 필요합니다.
WEB 작업시 페이지 단위가 아닌 Json 포멧 데이터를 받아 JavaScript 로 UI 로 변경하는 작업이 많습니다.
이를 AJAX 라고 일컫는데 이 글에서는 그 Json 포멧 데이터 요청 부분을 Web 브라우저가 아닌 C# 프로그래밍에서 처리 하는 방법을 배워보도록 하겠습니다.

  1. Ajax : Ajax는 Asynchronous JavaScript and XML의 약자로, 전체 페이지를 새로 고치지 않고도 웹 페이지를 업데이트하고 새로운 정보를 표시할 수 있는 웹 개발 기술입니다.
  2. JSON : JSON(JavaScript Object Notation)은 가벼운 데이터 교환 형식입니다. 사람이 읽고 쓰기 쉽고 구문 분석하고 생성하기 쉽습니다.

다음은 HTTP로 JSON 포멧 데이터를 받는 몇가지 방법을 소개해 드립니다.

먼저 이 글에서 예제로 사용할 web data는 다음과 같습니다.

C# HTTP로 JSON 데이터 받기 : HttpClient 의 활용

먼저 모델을 선언 하겠습니다.

  public  class Employee
    {
        public int EmployeeId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
    }
}

HttpWebRequest 를 활용한 Json 수신

WebRequest.Create() 메서드를 통한 HttpWebRequest 객체 생성
HttpWebRequest 객체는 WebRequest.Create() 메서드를 사용하여 생성된다. 이를 통해 HTTP 설정과 Headers 컬렉션에 필요한 HTTP 헤더 추가 등이 가능하다.
아래 예제는 httpbin.org에서의 HTTP GET 호출 예시이다.

코드 예제

string url = "http://localhost:5000/api/Employees";  //테스트 사이트
string responseText = string.Empty;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.Timeout = 30 * 1000; // 30초
request.ContentType = "application/json";
request.Headers.Add("SampleToken", "Samples"); // 헤더 추가 방법

using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
{
    HttpStatusCode status = resp.StatusCode;
    Console.WriteLine(status);  // 정상이면 "OK"

    Stream respStream = resp.GetResponseStream();
    using (StreamReader sr = new StreamReader(respStream))
    {
        responseText = sr.ReadToEnd();
        var emps = JsonConvert.DeserializeObject<List<Employee>>(responseText);
        // Newtonsoft.Json 를 이용한 Deserialize


        foreach (var Emp in emps)
        {
            Console.WriteLine("{0}\t{1}\t{2}\t{3}", 
              Emp.EmployeeId, Emp.FirstName, Emp.LastName, Emp.Age);
        }
    }
}

위 결과 값은 다음과 같습니다.

C# HTTP로 JSON 데이터 받기 : HttpClient 의 활용

GetResponse()
HttpWebRequest 객체로부터 GetResponse() 메서드를 호출하여 HTTP Request를 웹서버에 보내고 HTTP Response를 받아온다. 이후 반환된 HttpWebResponse 객체는 다양한 속성(예: StatusCode)을 가지며, Response 내용은 GetResponseStream() 메서드로부터 얻어낸 스트림을 통해 확인할 수 있다.
이렇게 수신된 Json 데이터를 역직렬화 하는 방법은 JsonConvert.DeserializeObject(responseText)
이는 이전 글에서 자세하게 다루었습니다.

HttpWebRequest 에 관한 자세한 정보는 Microsoft 문서에서 확인하실 수 있습니다.

https://learn.microsoft.com/ko-kr/dotnet/api/system.net.httpwebrequest?view=net-8.0

그런데 다음 글이 보이네요.

Remarks
We don’t recommend that you use for new development. Instead, use the System.Net.Http.HttpClient

대충 해석해 보면 새로만드는 프로젝트에서는 HttpClient 를 사용하라는 내용입니다.

HttpClient 를 활용한 Json 수신

다음은 MS 에서 권장한 HttpClient 를 활용한 Json 가져오기 예제입니다.

static void Main(string[] args)
{
	Task T = new Task(ApiCall);
	T.Start();
	Console.ReadLine();
}

static async void ApiCall()
{
	string url = "http://localhost:5000/api/Employees";  //테스트 사이트

	using (var client = new HttpClient())
	{
		HttpResponseMessage response = await client.GetAsync(url);
		response.EnsureSuccessStatusCode();
		using (HttpContent content = response.Content)
		{
			string responseBody = await response.Content.ReadAsStringAsync();
			Console.WriteLine(responseBody.Substring(0, 50) + "........");
			var emps = JsonConvert.DeserializeObject<List<Employee>>(responseBody);
			foreach (var Emp in emps)
			{
				Console.WriteLine("{0}\t{1}\t{2}\t{3}", 
				  Emp.EmployeeId, Emp.FirstName, Emp.LastName, Emp.Age);
			}
		}
	}
}

다음은 그 결과입니다.

C# HTTP로 JSON 데이터 받기 : HttpClient 의 활용

System.Net.Http.Json 를 활용한 간략화

System.Net.Http.Json 라이브러리를 사용하면 HttpGet 과 역직렬화를 자동으로 수행할 수 있습니다.
System.Net.Http.Json 에 포함된 GetFromJsonAsync 는 HttpClient 의 확장 메서드이며 위의 Get과 JsonConvert 를 자동으로 수행합니다.

static void Main(string[] args)
{
	Task T = new Task(ApiCall);
	T.Start();
	Console.ReadLine();
}

static async void ApiCall()
{
	string url = "http://localhost:5000/api/Employees";  //테스트 사이트
	using (var client = new HttpClient())
	{
		var emps = await client.GetFromJsonAsync<List<Employee>>(url);

		foreach (var Emp in emps)
		{
			Console.WriteLine("{0}\t{1}\t{2}\t{3}", 
			  Emp.EmployeeId, Emp.FirstName, Emp.LastName, Emp.Age);
		}
	}
}

결과는 다음과 같습니다.

C# HTTP로 JSON 데이터 받기 : HttpClient 의 활용

코드가 엄청 간단해 졌습니다.

결론

우리는 Http를 통한 Json 데이터를 C# 에서 수신하는 몇가지 방법을 알아보았습니다. 이 코드를 활용하여 쉬운 코딩이 되길 기원합니다.

Leave a Comment