我正在为几个不同的第三方API创建一个包装器,以有效地公开一个Web API
所以我的API会有类似的东西:
GET http://myapi.com/cars/1
响应:
{
"name": "DB9",
"make": "Aston Martin",
"speed": 123
}
但这实际上会在内部调用
GET http://astonmartinapi.com/db/9
响应:
{
"speed": 123
}
然后调用/cars/2
会回复{ "name": "mondeo", "make": "Ford", "speed": 34 }
,内部会调用GET http://fordapi.com/vehicles/mondeo
。
如何将我网站上不同实体的地图实施到这些第三方网站?
我有一个想法是创建一个映射器:
public JsonResult Get(int id = 0)
{
var car = db.Cars.Find(id);
// check not null, etc
switch (car.Make.Id) // refactor into method
{
case 1:
// query astonmartinapi
break;
case 2:
// query fordapi
break;
}
// return stuff
}
但这意味着硬编码的东西并不好。
有更好的想法吗?
答案 0 :(得分:2)
只是一个想法,但你可以写一个这样的界面:
public interface IExternalUrlProvider
{
string DownloadString(string baseUrl, string path);
string GetString(string baseUri, string relativePath, string userName, string password, AuthenticationSchemes scheme);
string Post(string baseUri, string relativePath, string userName, string password, AuthenticationSchemes scheme = AuthenticationSchemes.Basic, Dictionary<string, object> postParameters = null);
}
...然后你可以实现它并进行任何通用的REST调用。奖金是您还可以模拟单元测试的界面。
以上只是您可能会做的一个例子。您显然可以将返回类型更改为JObject(Newtonsoft JSON库)或其他任何内容。
您还可以创建一个不太常见的接口来进行通用HTTP调用,然后为每个第三方提供一个实现。