我想使用d创建一个RESTful Web应用程序。
哪些是最值得考虑的最积极维护和贡献的项目?这些网络框架与优缺点的简短比较将是不错的。
我的搜索引导我只看到一个项目,这似乎是一个很好的框架: 的 vibe.d
是否有其他项目的性质最小,如sinatra?
答案 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.d或Adam's web modules之上构建一个。
答案 2 :(得分:4)
你可以看看我正在建设什么。仍然非常alpha,但我正在尝试在D:http://jaredonline.github.io/action-pack/
中构建类似Rails的框架答案 3 :(得分:1)
我知道这是一个非常晚的答案,但我认为有一天可能会有人来,因为它已经很长时间,并且D社区内发生了很多变化,特别是对于网络开发。
使用Diamond,您可以编写RESTful Web应用程序,而无需一起攻击,因为它在框架内支持它。
答案 4 :(得分:0)
您可以尝试Hunt Framework。
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"
}