0

我正在为几个不同的 3rd 方 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 }which 将在内部调用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
}

但这意味着硬编码的东西不好。

有更好的想法吗?

4

1 回答 1

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 调用不那么固执己见的接口,然后为每个第三方提供一个实现。

于 2013-11-11T22:53:37.377 回答