나누고 싶은 개발 이야기

Data Engineer로서 기록하고 공유하고 싶은 기술들. 책과 함께 이야기합니다.

Language/C#

HttpClient

devidea 2013. 6. 29. 13:11

HttpClient

HttpClient는 .Net에서 제공하는 유연하고 확장가능한 API 접근 모듈이다. NuGet에서 다운로드 받을 수 있으며 아래와 같은 package들로 구성되어 있다.

1. System.Net.Http : HttpClient와 관련된 기본 클래스들을 포함하고 있다.

2. System.Net.Http.Formatting : 직렬화, 역직렬화의 추가적인 기능을 포함.

3. System.Json : Json 문서를 읽고 조작하기 위한 기능을 포함.


Install Nuget Package Manager

Nuget에서 Microsoft ASP.NET Web API Client Libraries를 다운 받으면 된다.


HttpClient를 쓰는 예제는 아래 url에서 구현된 web api를 호출 하는 것으로 구성되어 있다.

http://www.asp.net/web-api/overview/creating-web-apis/creating-a-web-api-that-supports-crud-operations



Add the Model Class

결과 수신을 위한 Class를 생성한다.

public class Product
 {
     public string Name { get; set; }
     public double Price { get; set; }
     public string Category { get; set; }
 }


Initialize HttpClient & Getting a Resource (HTTP GET)

예제에서 설정한 url은 local.product.com이고 수신될 header의 타입은 "application/json"으로 하였다.

namespace ProductStoreClient
{
    class Program
    {
        static void Main(string[] args)
        {
            HttpClient client = new HttpClient();
            client.BaseAddress = new Uri("http://local.product.com/");

            // Add an Accept header for JSON format.
            client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));           

            // List all products.
            var products = response.Content.ReadAsAsync<ienumerable<product>>().Result;
            if (response.IsSuccessStatusCode)
            {
                var products = response.Content.ReadAsAsync<product>.Result;
                foreach (var p in products)
                {
                    Console.WriteLine("{0}\t{1};\t{2}", p.Name, p.Price, p.Category);
                }
            }
            else
            {
                Console.WriteLine("{0}, ({1})", (int)response.StatusCode, response.ReasonPhrase);
            }
        }
    }
}
GetAsync 함수를 통해서 HTTP GET 요청을 보낸다. GetAsync는 비동기적으로 처리한다. 서버로부터의 응답에 대한 대기 없이 결과가 오면 즉시 처리하게 된다. 리턴된 값은 Task object로 결과를 받는다. 요청이 완료되었을 때, Task.Result 프로퍼티에 HTTP response 값을 가지게 된다.


중요한 점은 Result 프로퍼티는 요청한 application thread를 요청이 끝날 때(혹신 시간완료)까지 차단하게 된다. Console에서의 차단은 괜찮지만 Window application의 차단은 다른 UI 동작도 막게 되는 결과가 생긴다. non-blocking(비차단)에 대한 요청은 다음 튜토리얼을 확인하도록 하자.


HTTP response가 성공되었다면, response body 값에 JSON format의 값이 포함되어 있을 것이다. ReadAsAsync함수를 호출해서 JSON 형식의 값을 해석하게 된다. response body 값을 특정한 CLR type으로 역직렬화 하게 된다. 이 함수도 비동기적으로 처리한다.


예제의 호출 결과를 Fiddler로 확인 결과는 다음과 같다.


반응형

'Language > C#' 카테고리의 다른 글

[ASP.NET MVC] Complie-Time에 View 에러 확인  (0) 2013.12.20
HTTP 인증(1) - Basic  (0) 2013.09.04
JsonResult Serializer 변경  (0) 2013.05.10
날짜 형식 찾기 위한 정규식  (1) 2010.04.13