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

REST框架在D中有哪些选项?,d,sinatra,rest,web,vibed,D,Sinatra,Rest,Web,Vibed,我想使用创建一个RESTful web应用程序 哪些最积极维护和贡献的项目值得考虑?简单比较一下这些web框架的优缺点就可以了 通过搜索,我只找到了一个项目,这似乎是一个很好的框架: 还有其他一些项目在本质上是最小的吗?我听说过vibe.d的好东西 尽管如此,我从未亲自使用过它,因为我早在vibe问世之前就编写了自己的库。 vibe有更好的文档记录,因此您最好去那里,但以下是我的库的工作方式: cgi.d是基本web界面(如果需要,在编译时使用-version=embedded_httpd来

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

哪些最积极维护和贡献的项目值得考虑?简单比较一下这些web框架的优缺点就可以了

通过搜索,我只找到了一个项目,这似乎是一个很好的框架:


还有其他一些项目在本质上是最小的吗?

我听说过vibe.d的好东西

尽管如此,我从未亲自使用过它,因为我早在vibe问世之前就编写了自己的库。

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并格式化数据

该部分的源代码是:

import arsd.web;
class MySite : ApiProvider {
     export int addSomeNumbers(int a, int b) { return a+b; }
}
mixin FancyMain!MySite;
d自动生成您在那里看到的表单,将url解析为给定的类型,并将返回值格式化为html、json或其他格式(例如,可以将对象制成表)

还有一个envelopeFormat url param,可以用更多的json将其包装起来,最适合机器使用:

my 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;
但是是的,我的图书馆的大部分文档都是我在论坛上谈论的。。。我想一旦你完成了一个功能,就不难理解了,但我有偏见

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


事实上,我确实考虑过让URL映射到对象,动词经过:web.d还包括一个ApiObject类,它是:/obj/name->newobj(“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/
}
当然,还要定义对象:

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;
然后您可以访问它:

顺便说一句,后面的斜杠是必须的:这是我还没有解决的突出错误之一。(后面的斜杠代码比它应该的更复杂,这使得它看起来更难修复。)

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

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

或用于机器消耗:

该物业也可供选择:

另一个主要的突出缺陷是,自动生成的Javascript函数根本无法访问子对象。它们只在顶级ApiProvider上的函数上工作。另一个比看起来更难修复的缺陷,我并不特别想这么做,因为顶级函数无论如何都可以做到。当然,您可以uld自己在xmlhttprequest上创建URL并以这种方式访问它

让我们通过快速组合一个表单来演示帖子:

您可以提交一些内容,然后看到POST处理程序确实重置了名称。(顺便说一句,该操作有一个尾随斜杠:没有它,它会自动重定向您!我真的应该修复它。)


无论如何,尽管存在bug,但它的核心仍然有效,并且可能是目前最接近全面REST D的东西。

在撰写本文时,据我所知,还没有构建真正REST式web服务的框架。但是,您应该能够轻松地在上面提到的基础上构建一个框架。

您可以看看我正在构建的东西。仍然非常alpha,但我正在尝试在D中构建一个类似Rails的框架:

我知道这是一个非常晚的答案,但我想有一天可能会有人来,因为时间太长了,D社区内发生了很多变化,特别是在web开发方面

使用Diamond,您可以编写RESTful web应用程序,而无需将某些内容组合在一起,因为它在框架内支持RESTful web应用程序

你可以试试

路线设置 app/UserController.d源代码: 要求
不幸的是,这种“购物”问题并不是最适合这样做。我并不是真的在购买框架。有无数关于Java web框架比较的问题,Python、Ruby等也是如此。我认为作为一种优秀的语言,D应该有一个关于web框架比较的stackoverflow问题。我认为这些问题也不合适。但它们是真实存在的。我认为这更适合于D标签上的信息页面(所做的研究;发布的信息链接,而不是问题)。我不认为比较问题应该出现在语言网站上,而不是stackoverflow上。D信息页面可以列出用D编写的web框架,(这就是Haskell的信息页面所做的)。但是,积极研究和使用这些框架的人,即程序员,可以告诉其他人每种框架的优点和缺点。如果你正在寻找pac的详细清单
GET    /user/{id}    user.detail
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);
    }
}
{
    "id": 123,
    "name": "test"
}