D中的REST框架有哪些选项?

Sal*_*lil 5 rest d web vibed

我想用来创建一个RESTful Web应用程序.

哪些是最积极维护和贡献的项目值得考虑?这些Web框架与优缺点的简短比较将是很好的.

我的搜索引导我只有一个项目,这似乎是一个很好的框架: vibe.d

还有其他像这样性质极小的项目吗?

Ada*_*ppe 7

我听说过有关vibe的好消息.http: //vibed.org/

虽然,我从来没有亲自使用它,因为我在vibe出来之前就已经写好了自己的库. https://github.com/adamdruppe/misc-stuff-including-D-programming-language-web-stuff

vibe有更好的记录,所以你最好去那里,但这是我的图书馆的工作方式:

cgi.d是基本的Web界面(如果需要,在编译时使用-version = embedded_httpd来使用自己的Web服务器而不是CGI),并在一个名为web.d的单独文件中提供一些RESTy内容.它取决于cgi.d,dom.d,characterencodings.d和sha.d. 您可能还需要database.d和mysql.d来连接到mysql数据库.

web.d的工作方式是你只需编写函数,它会自动将它们映射到url并格式化数据.

http://arsdnet.net/cgi-bin/apidemo/add-some-numbers

该部分的源代码是:

import arsd.web;
class MySite : ApiProvider {
     export int addSomeNumbers(int a, int b) { return a+b; }
}
mixin FancyMain!MySite;
Run Code Online (Sandbox Code Playgroud)

web.d自动生成您在那里看到的表单,将url解析为给定的类型,并将返回值格式化为html,json或有时其他内容(例如,可以将对象组成表).

还有一个envelopeFormat url param可以将它包装在更多的json中,最适合机器消耗:http://arsdnet.net/cgi-bin/apidemo/add-some-numbers?a = 1&b = 2& format = json&envelopeFormat = json

我的github中的web.d.php显示了一种可以使用它的方法,而web.d本身自动生成javascript函数来从客户端调用:

MySite.addSomeNumbers(10, 20).get(function(answer) { alert("Server replied: " + answer); });
Run Code Online (Sandbox Code Playgroud)

答案将是D函数返回的类型.

如果您不想/需要自动函数换行,单独使用cgi.d可以访问基本信息和编写函数:

void requestHandler(Cgi cgi) {
    // there's cgi.get["name"], cgi.post["name"], or cgi.request("name"), kinda like php
    cgi.write("hello ", cgi.request("name"));
}
mixin GenericMain!requestHandler;
Run Code Online (Sandbox Code Playgroud)

但是,大多数为我的图书馆存在的文档只是我在论坛上讨论它...我认为一旦你完成了一个功能就不难理解,但我有偏见!

编辑:从下面的评论中复制/粘贴,因为它与真正获得RESTy非常相关:

我实际上确实想到让url映射到对象并且动词通过:web.d还包括一个ApiObject类:/ obj/name - > new Obj("name"); 然后调用适当的方法.所以GET/obj/name调用(新的Obj("name")).GET();,对于POST,PUT等是相同的.然后/ obj/name/foo调用(new Obj("name").foo() ;与我在上述功能中描述的规则相同.

但是我没有像普通的功能那样使用它,因为它仍然有点儿马车....而且它仍然有点马车,因为我没有足够的使用它坐下来适合它!大声笑

您可以通过编写ApiObject类然后将其别名化为ApiProvider来使用它:

import arsd.web;
class MySite : ApiProvider {
     export int addSomeNumbers(int a, int b) { return a+b; }
     alias MyObject obj; // new, brings in MyObject as /obj/xxx/
}
Run Code Online (Sandbox Code Playgroud)

当然,定义对象:

class MyObject : ApiObject {
    CoolApi parent;
    string identifier;
    this(CoolApi parent, string identifier) {
    this.parent = parent;
    this.identifier = identifier;

    /* you might also want to load any existing object from a database or something here, using the identifier string, and initialize other members */
    // for now to show the example, we'll just initialize data with dummy info

    data.id = 8;
    data.name = "MyObject/" ~ identifier;
    }

    /* define some members as a child struct so we can return them later */
    struct Data {
    int id;
    string name;
    Element makeHtmlElement() {
        // for automatic formatting as html
        auto div = Element.make("div");
        import std.conv;
        div.addChild("span", to!string(id)).addClass("id");
        div.appendText(" ");
        div.addChild("span", name).addClass("name");
        return div;
    }
    }

    Data data;

    export Data GET() {
    return data;
    }

    export Data POST(string name) {
    parent.ensureGoodPost(); // CSRF token check

    data.name = name;
    // normally, you'd commit the changes to the database and redirect back to GET or something like that, but since we don't have a db we'll just return the modified object

    return data;
    }

// property accessors for the data, if you want
    export int id() {
    return data.id;
    }
}

mixin FancyMain!MySite;
Run Code Online (Sandbox Code Playgroud)

然后你可以访问它:

http://arsdnet.net/cgi-bin/apidemo2/obj/cool/

BTW尾随斜线是强制性的:这是我尚未解决的突出错误之一.(尾部斜杠代码比它应该更复杂,使其更难以修复它可能看起来.)

无论如何,您可以通过makeHtmlElement看到对象呈现为html.这是展示其他格式的好时机:

http://arsdnet.net/cgi-bin/apidemo2/obj/cool/?format=table

表,也尝试csv,当然还有json

http://arsdnet.net/cgi-bin/apidemo2/obj/cool/?format=json

或用于机器消耗:http: //arsdnet.net/cgi-bin/apidemo2/obj/cool/?format = json&envelopeFormat = json

该物业也可用:http: //arsdnet.net/cgi-bin/apidemo2/obj/cool/id

另一个主要的突出问题是自动生成的Javascript函数根本无法访问子对象.它们仅适用于顶级ApiProvider上的功能.另一个比它看起来更难修复的错误,我并不是特别喜欢这样做,因为顶层函数无论如何都可以完成.当然,您可以在xmlhttprequest上自己创建URL并以这种方式访问​​它.

让我们通过拼凑一个快速表单来演示POST:

http://arsdnet.net/cgi-bin/apidemo2/poster

你可以提交一些东西,看看POST处理程序确实重置了名称.(顺便说一句,请注意该操作具有斜杠:没有它,它会默默地重定向您!我真的应该修复它.)

无论如何,尽管存在错误,它的核心工作并且可能是最接近完全成熟的REST D的东西.


Dej*_*kic 6

在撰写本文时,没有框架可以构建我所知道的真正的RESTful Web服务.但是,您应该能够轻松地在上面已经提到的vibe.dAdam的Web模块之上构建一个.