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



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

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

我的搜索只引导我找到一个项目,这似乎是一个很好的框架:共鸣

还有其他项目像辛纳屈一样本质上是最小的吗?

我听说过关于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 或有时其他内容(例如,可以将对象制作成表)。

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

web.d.php 在我的 GitHub 中展示了一种使用它的方式,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 -> new Obj("name");然后对其调用适当的方法。所以 GET/obj/name calls (new 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/

顺便说一句,尾部斜杠是强制性的:这是我尚未修复的突出错误之一。(尾随斜杠代码比它应该的更复杂,这使得它可能看起来更难修复。

无论如何,您可以通过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的东西。

在撰写本文时,据我所知,还没有构建真正的 RESTful Web 服务的框架。但是,您应该能够在vibe.d或他上面已经提到的Adam的Web模块上轻松构建一个。

你可以看看我正在构建什么。仍然非常alpha,但我正在尝试在D中构建一个类似Rails的框架:http://jaredonline.github.io/action-pack/

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

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

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

你可以试试Hunt Framework。

路线设置

GET    /user/{id}    user.detail

app/UserController.d souce code:

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"
}

相关内容

  • 没有找到相关文章

最新更新