我想用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"
}