Javascript 编写JS代码模仿api设计

Javascript 编写JS代码模仿api设计,javascript,rest,api-design,Javascript,Rest,Api Design,我们正计划在我的工作场所重建我们的服务,创建一个RESTful API等等。我碰巧遇到了一个有趣的问题:我能用一种模仿API设计的方式来编写JS代码吗 下面是一个例子来说明我的意思: 我们有狗,您可以通过GET/dogs访问这些狗,并通过GET/dogs/{id}获取特定狗的信息 我的Javascript代码将类似于 var api = { dogs : function(dogId) { if ( dogId === undefined ) {

我们正计划在我的工作场所重建我们的服务,创建一个RESTful API等等。我碰巧遇到了一个有趣的问题:我能用一种模仿API设计的方式来编写JS代码吗

下面是一个例子来说明我的意思:

我们有狗,您可以通过
GET/dogs
访问这些狗,并通过
GET/dogs/{id}
获取特定狗的信息

我的Javascript代码将类似于

var api = {
    dogs : function(dogId) {
        if ( dogId === undefined ) {
            //request /dogs from server
        } else {
            //request /dogs/dogId from server
        }
    }
}
如果代码很好,我只需要调用
api.dogs()
api.dogs(123)
就可以得到我想要的信息

现在,让我们假设这些狗有一个疾病列表(或者其他什么),你可以通过
GET/dogs/{id}/disases
获取。有没有办法修改我的Javascript,使以前的调用保持不变-
api.dogs()
返回所有的狗和
api.dogs(123)
返回狗123的信息-同时允许我执行类似
api.dogs(123).diseases()的操作来列出狗123的疾病

我想到的最简单的方法是让我的方法实际构建查询而不是检索数据,然后使用
get
run
方法实际运行这些查询并获取数据

我能想到的构建这样东西的唯一方法是,在执行一个函数时,如果有其他函数链接到对象,但我不知道这是否可能


您对此有何想法?

我不能给您一个具体的实施方案,但可以给您一些提示,说明如何实现您的目标。了解您使用的是哪种服务器和框架会很有趣

  • 生成(自己编写或从代码自动生成)描述服务的WADL,然后尝试生成代码,例如使用XSLT
  • 在我使用的REST项目中,它分析一些常见的JavaREST实现并生成JSON描述,您可以将其用作JavaScript API的基础

  • 对于简单的RESTAPI来说可能很容易,但随着API划分为复杂的层次结构或具有树结构,它会变得复杂。那么一切都将取决于您的服务的确切文档。

    假设您的JS应用程序知道REST API提供的服务,即发送描述服务的JSON或XML文件,您可以执行以下操作:

    var API = (function(){
        // private members, here you hide the API's functionality from the outside.
    
        var sendRequest = function (url){ return {} }; // send GET request
    
        return {
            // public members, here you place methods that will be exposed to the public.
    
            var getDog = function (id, criteria) {
                // check that criteria isn't an invalid request. Remember the JSON file?
                // Generate url
                response = sendRequest(url);
                return response;
            };
        };
    }());
    
    var diseases = API.getDog("123", "diseases");
    var breed = API.getDog("123", "breed");
    
    上面的代码不是100%正确的,因为您仍然需要处理AJAX调用,但这或多或少是您想要的


    我希望这有帮助

    像这样的-?罗斯,这不是真的。这个答案似乎只提供了一级深度api调用,比如我的
    api.dog()
    ,但不允许我执行
    api.dog(123.diseases()
    )。我不确定我是否已经说得够清楚了=/Pedro,你的确切意思是什么?它必须是那种精确的语法,还是像
    api.dog(123.diseases().execute()
    这样的东西可以接受?检索狗列表的等价物可以是
    api.dog().execute()
    @但我不会对这种语法有任何问题,它实际上会使在执行
    POST
    DELETE
    或其他任何操作时变得更容易,但我真的很好奇,确切的语法就是这样做的一种方法,是的,但是,如果您将请求用作字符串,就像您在
    疾病
    繁殖
    中所做的那样,您将失去自动完成功能。然后你必须不断地查找一些文档,找出哪些方法是允许的,哪些是不允许的。是的,我知道,这就是为什么我说它不是100%正确的。我很擅长制作JS API,但这就是我要做的。我们目前使用的是LAMP堆栈,但我不知道后端会如何改变我的前端实现。另外,我不能完全从你所说的跳到我所想的,你能再详细一点吗?你的问题似乎是你想要一个JS API,它可以自动生成一些带有函数的对象结构,从而简化REST API的使用。我刚才提出了一些如何实现这一目标的想法。当然,您可以自己编写这些方法,但是如果api能够在收到响应时自行“更新”甚至动态生成这些方法,那就太酷了。但这肯定取决于特定的需求和RESTAPI的结构。