在我的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;
}
}
}
答案 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)
返回对象或使用动态返回类型。