我听说过有关vibe的好消息.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;
Run Code Online (Sandbox Code Playgroud)
web.d自动生成您在那里看到的表单,将url解析为给定的类型,并将返回值格式化为html,json或有时其他内容(例如,可以将对象组成表).
还有一个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); });
Run Code Online (Sandbox Code Playgroud)
答案将是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;
Run Code Online (Sandbox Code Playgroud)
但是,大多数为我的图书馆存在的文档只是我在论坛上讨论它...我认为一旦你完成了一个功能就不难理解,但我有偏见!
编辑:从下面的评论中复制/粘贴,因为它与真正获得RESTy非常相关:
我实际上确实想到让url映射到对象并且动词通过:web.d还包括一个ApiObject类:/ obj/name - > new Obj("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/
}
Run Code Online (Sandbox Code Playgroud)
当然,定义对象:
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;
Run Code Online (Sandbox Code Playgroud)
然后你可以访问它:
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的东西.
归档时间: |
|
查看次数: |
2041 次 |
最近记录: |