2014-12-07 45 views
2

在我的MVC應用程序中,我做了很多需要幾行代碼的Web API調用。我想創建一個集中的API調用方法,只需將一些簡單的參數傳遞給它,例如呼叫類型(GET,POST等),Url等。想要集中調用我的Web API的代碼

我需要幫助的是在每種情況下,我將返回不同的對象類型,例如Employee,List <Project>等。如何返回不同的對象類型?

另一個問題是,如果我想進行POST或PUT調用,我會將不同類型的對象傳入我的集中式API調用方法。再次,我有同樣的問題,我必須能夠接受不同的對象類型。

我想,我可以只傳遞Json對象,但我不確定這是正確的方法,還是有更好的方法。我確信其他人已經試圖集中他們的Web 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個樣本?你也許可以爲你的代碼創建一個基類,或者創建一個call handler類,但是在這兩種情況下,你都必須泛型傳遞參數和返回類型。 – 2014-12-07 06:20:22

+0

剛剛更新了我原來的帖子,並附上了我提出的示例代碼。我從來沒有返回過一個通用對象,所以我試圖瞭解我是如何做到這一點的。我在代碼中不清楚的其他部分是,當我從Web API收到錯誤響應時。那麼我會返回什麼? – Sam 2014-12-07 06:27:11

+0

太棒了,讓我給你寫一些代碼,並在這裏發佈它。 – 2014-12-07 06:36:55

回答

1

試試這個:這是一個起點,你可以在此基礎上構建,但想法是ApiCaller是一個實現IApiCaller接口的類(所以你可以在後面模擬它),並且這個類使用相同的方法啓動HttpClient options/headers,並且該方法將使用/處理此HttpClient以連接到服務器,並且每個方法在調用者調用方法(如Get)時定義返回類型T.

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 2014-12-07 07:18:45

+0

1-以前您的GetApiCaller方法是一種靜態方法,但我已將其更改爲實例方法,這意味着您必須通過新方法初始化ApiCaller類。我使用Interface IApiCaller,所以你可以模擬這個類進行單元測試,谷歌「Moq庫」或「C#單元測試」以更多地瞭解單元測試。 3,您的MVC控制器將注入IApiCaller接口,您可以使用像Autofac這樣的IoC容器來設置依賴關係。這是足夠清楚還是需要更多? – 2014-12-07 07:29:41

+0

我有點清楚,但我不想花太多時間。你一直非常有幫助!如果你不介意的話,我想再問一個問題。把它變成一個靜態類不是更好,這樣我就不必每次創建一個ApiCaller類的新實例,因爲我需要創建一個API調用? – Sam 2014-12-07 07:40:06

0

返回一個對象或使用動態返回類型。

+0

我可以使用更多的幫助。我如何返回「結果」。另外,如果我從Web API調用中收到錯誤,那麼我該如何返回? – Sam 2014-12-07 06:21:28

相關問題