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

时间:2013-10-16 02:16:46

标签: rest web d vibed

我想使用创建一个RESTful Web应用程序。

哪些是最值得考虑的最积极维护和贡献的项目?这些网络框架与优缺点的简短比较将是不错的。

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

是否有其他项目的性质最小,如

5 个答案:

答案 0 :(得分:7)

我听说过有关vibe.d 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;

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

还有一个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); });

回答是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;

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

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

我确实玩过将url映射到对象并且动词通过的想法:web.d还包括一个ApiObject类:/ obj / name - >新的Obj(“名称”);然后调用适当的方法。所以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/
}

当然,定义对象:

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;

然后你可以访问它:

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的东西。

答案 1 :(得分:6)

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

答案 2 :(得分:4)

你可以看看我正在建设什么。仍然非常alpha,但我正在尝试在D:http://jaredonline.github.io/action-pack/

中构建类似Rails的框架

答案 3 :(得分:1)

我知道这是一个非常晚的答案,但我认为有一天可能会有人来,因为它已经很长时间,并且D社区内发生了很多变化,特别是对于网络开发。

使用Diamond,您可以编写RESTful Web应用程序,而无需一起攻击,因为它在框架内支持它。

http://diamondmvc.org/docs/backend/#rest

答案 4 :(得分:0)

您可以尝试Hunt Framework

路线设置

GET    /user/{id}    user.detail

app / UserController.d源代码:

module app.controller.UserController;

import hunt.framework;

class User
{
    int id;
    string name;
}

class UserController : Controller
{
    mixin MakeController;

    @Action
    JsonResponse detail(int id)
    {
        auto user = new User;
        user.id = id;
        user.name = "test";

        return new JsonResponse(user);
    }
}

请求http://localhost:8080/user/123

{
    "id": 123,
    "name": "test"
}