想要集中调用我的Web API的代码

时间:2014-12-07 05:55:02

标签: c# asp.net-mvc asp.net-web-api2

在我的MVC应用程序中,我进行了大量需要几行代码的Web API调用。我想创建一个集中的方法来进行API调用,并将一些简单的参数传递给它,例如呼叫类型(GET,POST等),Url等

我需要帮助的地方是,在每个场景中,我将返回不同的对象类型,例如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;
      }
   }
}

2 个答案:

答案 0 :(得分:1)

试试这个:这是一个起点,你可以在此基础上构建,但想法是ApiCaller是一个实现接口IApiCaller的类(所以你可以稍后模拟它),这个类用相同的选项启动HttpClient / headers,该方法将使用/ dispose这个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;
    }
}

希望有所帮助。

答案 1 :(得分:0)

返回对象或使用动态返回类型。