2014-12-07 3 views
2

MVC 응용 프로그램에서 몇 줄의 코드가 필요한 많은 웹 API 호출을합니다. API 호출을위한 중앙 집중식 메소드를 작성하고 간단한 매개 변수를 API에 전달하는 것과 같습니다. 호출 유형 (GET, POST 등), URL 등내 웹 API를 호출하는 코드를 중앙 집중화하려고합니다.

여기서 도움이 필요한 것은 각 시나리오에서 다른 개체 유형을 반환한다는 것입니다. 피고용자,리스트 < 프로젝트 > 등 어떻게 다른 객체 유형을 반환합니까?

다른 문제는 POST 또는 PUT 호출을 만들고 싶다면 여러 유형의 객체를 중앙 API 호출 메소드에 전달한다는 것입니다. 다시 말하지만, 다른 문제 유형을 수용 할 수 있어야하는 동일한 문제가 있습니다.

나는 Json 오브젝트를 안팎으로 통과시킬 수 있다고 생각하지만, 올바른 접근 방식인지 또는 더 나은 접근 방식이 있는지 확실하지 않습니다. 나는 다른 사람들이 웹 API 콜 코드를 중앙화하려고 시도했다고 확신한다.

* 업데이트 * 여기는 내가 가지고 있지만 조금 더 도움이 필요합니다. 어떻게 결과를 반환합니까?

public static async Task<object> GetApiCall(string apiActionUrl) 
{ 
    using (var client = new HttpClient()) 
    { 
     client.BaseAddress = new Uri("http://myApiBaseUrl"); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     HttpResponseMessage response = await client.GetAsync(apiActionUrl); 
     if (response.IsSuccessStatusCode) 
     { 
     var result = response.Content.ReadAsStringAsync().Result; 
     } 
    } 
} 
+0

코드에서 중앙 집중화하려는 2 개의 샘플을 표시 할 수 있습니까? 코드에 대한 기본 클래스를 만들거나 호출 처리기 클래스를 만들 수 있지만 두 경우 모두 매개 변수와 반환 형식을 전달하기위한 제네릭을 사용해야합니다. –

+0

필자가 작성한 샘플 코드로 원래 게시물을 업데이트했습니다. 전에는 일반 객체를 반환하지 않았으므로 어떻게 처리하는지 이해하려고합니다. 내 코드에서 분명하지 않은 부분은 웹 API에서 오류 응답을받는 경우입니다. 그럼 내가 무엇을 돌려 줄까요? – Sam

+0

위대한, 당신에게 몇 가지 코드를 작성하고 여기에 게시됩니다. –

답변

1

시도해보십시오.이 점을 시작점으로 삼을 수 있습니다.하지만 ApiCaller는 IApiCaller 인터페이스를 구현하는 클래스이므로 (나중에 조롱 할 수 있음)이 클래스는 같은 클래스로 HttpClient를 시작합니다. options/headers이며이 메서드는이 HttpClient를 사용하여 서버에 연결합니다. 각 메서드는 호출자가 메서드를 호출 할 때 반환 형식 T를 정의합니다 (예 : Get).

public interface IApiCaller 
{ 
    Task<T> Get<T>(string apiActionUrl); 
} 

public class ApiCaller : IApiCaller 
{ 
    private const string ApiBaseUrl = "http://myApiBaseUrl"; 

    public async Task<T> Get<T>(string apiActionUrl) 
    { 
     using (var client = GetHttpClient()) 
     { 
      var response = await client.GetAsync(apiActionUrl); 
      if (response.IsSuccessStatusCode) 
      { 
       var jsonString = response.Content.ReadAsStringAsync().Result; 
       return JsonConvert.DeserializeObject<T>(jsonString); 
      } 
     } 

     return default(T); 
    } 

    private static HttpClient GetHttpClient() 
    { 
     var client = new HttpClient 
     { 
      BaseAddress = new Uri(ApiBaseUrl), 
     }; 

     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     return client; 
    } 
} 

는이 같은이 클래스를 사용할 수 있습니다

public class SomeMvcController : Controller 
{ 
    private readonly IApiCaller _apiCaller; 

    // use this if you don't want to rely on Dependency Injection, OR 
    // if you don't use Ioc container for now.  
    public SomeClass(): this(new ApiCaller()) 
    { 
    } 

    public SomeClass(IApiCaller apiCaller) 
    { 
     _apiCaller = apiCaller; 
    } 

    public async Task<string> GetStringFromWebApi() 
    { 
     string result = await _apiCaller.Get<string>("myApiUrl"); 

     return result; 
    } 
} 

희망을.

+0

이 코드는 멋지고 정교하게 보이지만 내 수준보다 위에있는 코드가 있습니다. 당신이 나를 이해할 수있을 정도로 친절 해 주시겠습니까? 첫째, API 호출을해야하는 MVC 작업 메서드에서 호출 할 수 없었습니다. MyApp.ApiCaller.Get()을 시도했지만 intellisense는 모두 Equals 및 ReferenceEquals입니다. Get 메서드가 표시되지 않습니다. 또한 왜 IApiCaller 인터페이스를 상속하는지 명확하지 않습니다. 그 이점은 무엇입니까? – Sam

+0

1- 이전에 GetApiCaller 메서드는 정적 메서드 였지만 인스턴스 메서드로 변경했습니다. 즉, ApiCaller 클래스를 새로 초기화해야한다는 의미입니다. 2 - 인터페이스 IApiCaller를 사용하여 단위 테스트, google "Moq Library"또는 "C# unit testing"에 대해이 클래스를 조롱하여 단위 테스트에 대해 자세히 알 수 있습니다. 3 - MVC 컨트롤러에 IApiCaller 인터페이스가 삽입되어 Autofac과 같은 IoC 컨테이너를 사용하여 종속성을 설정할 수 있습니다. 이 정도면 충분합니까 아니면 더 많이 필요합니까? –

+0

나는 다소 분명하지만 시간을 너무 많이 보내고 싶지 않습니다. 당신은 매우 도움이되었습니다!네가 괜찮다면 한 가지 더 묻고 싶다. API 호출을해야 할 때마다 ApiCaller 클래스의 새 인스턴스를 만들 필요가 없도록 정적 클래스로 만드는 것이 좋지 않습니까? – Sam

0

개체를 반환하거나 동적 반환 유형을 사용하십시오.

+0

조금 더 많은 도움을받을 수 있습니다. "결과"를 어떻게 반환합니까? 또한 웹 API 호출에서 오류가 발생하면 어떻게해야합니까? – Sam

관련 문제