.net 에서 외부 API호출을 하는 클라이언트 객체가 필요할시 기본제공되는 WebClient 만으로 충분하게 사용할수 있지만
Flurl을 이용하면 더 유연하고 테스트가능한 형태로 API Client를 구현할수 있습니다. ( unit testing with the functionality )
url :
기본사용
Code IT
// Flurl will use 1 HttpClient instance per host var person = await "https://api.com" .AppendPathSegment("person") .SetQueryParams(new { a = 1, b = 2 }) .WithOAuthBearerToken("my_oauth_token") .PostJsonAsync(new { first_name = "Claire", last_name = "Underwood" }) .ReceiveJson<Person>();
Test It
// fake & record all http calls in the test subject using (var httpTest = new HttpTest()) { // arrange httpTest.RespondWith(200, "OK"); // act await sut.CreatePersonAsync(); // assert httpTest.ShouldHaveCalled("https://api.com/*") .WithVerb(HttpMethod.Post) .WithContentType("application/json"); }
호출해야하는 API의 URL의 인자값이 복잡할시 이것을 문자열 결합으로만 만들게 되면 가독성이 안좋아지고 실수할 가능성이 높습니다.
특히나 인자값중 특수문자가 URLEncode처리되면 호출 URL 문자열을 눈 으로 검증하기는 더욱더 어려워 집니다.
Flurl을 사용하면 함수형 방식으로 Safe하고 유연한 URL Builder가 가능하며, 간편하게 Json 호출결과물을 Object로 변환가능합니다.
유닛테스트는 보너스입니다.
예외처리
try { await url.PostJsonAsync(poco); } catch (FlurlHttpTimeoutException) { // FlurlHttpTimeoutException derives from FlurlHttpException; catch here only // if you want to handle timeouts as a special case LogError("Request timed out."); } catch (FlurlHttpException ex) { // ex.Message contains rich details, inclulding the URL, verb, response status, // and request and response bodies (if available) LogError(ex.Message); }
예외대상지정
url.AllowHttpStatus(HttpStatusCode.NotFound, HttpStatusCode.Conflict).GetAsync(); url.AllowHttpStatus("400-404,6xx").GetAsync(); url.AllowAnyHttpStatus().GetAsync();
Http의 Status 에러코드는 정상적인 네트워크 반환입니다. 하지만 이것을 호출하는 입장에서 그것이 허용하는 결과치일수도 있고
아닐수도 있습니다. 이것은 Status에대한 예외범위를 클라이트쪽에서 결정할수 있고 예외 프로그래밍 설계를할수 있다란 의미입니다.
.