Ho sentito parlare bene di vibe.d http://vibed.org/
Anche se, non ho mai usato personalmente, perché ho scritto le mie librerie ben prima che l'atmosfera è venuto fuori. https://github.com/adamdruppe/misc-stuff-including-D-programming-language-web-stuff
atmosfera è meglio documentato, in modo da potrebbe essere meglio andare lì, ma ecco come funzionano le mie librerie:
cgi.d è l'interfaccia web di base (uso -version = embedded_httpd durante la compilazione di utilizzare il suo possiedi un web server al posto di CGI se lo desideri), e offro alcune cose RESTy in un file separato chiamato web.d. Dipende da cgi.d, dom.d, characterencodings.d e sha.d. Si potrebbe anche voler database.d e mysql.d per la connessione a un database mysql.
Il modo in cui funziona web.d è che basta scrivere le funzioni e le mappa automaticamente in url e formatta i dati.
http://arsdnet.net/cgi-bin/apidemo/add-some-numbers
Il codice sorgente a quella parte è:
import arsd.web;
class MySite : ApiProvider {
export int addSomeNumbers(int a, int b) { return a+b; }
}
mixin FancyMain!MySite;
web.d genera automaticamente la forma che si vede lì, analizza l'URL in tipi dato, e formatta il valore di ritorno in entrambi i html, json o talvolta altre cose (ad esempio, gli oggetti possono essere trasformati in tabelle).
C'è anche un URL param envelopeFormat che può avvolgerlo in più JSON, meglio per il consumo macchina: http://arsdnet.net/cgi-bin/apidemo/add-some-numbers?a=1&b=2&format=json&envelopeFormat=json
web.d.php nel mio github mostra un modo è possibile consumare, e web.d si genera automaticamente funzioni javascript per chiamare dal client:
MySite.addSomeNumbers(10, 20).get(function(answer) { alert("Server replied: " + answer); });
risposta sarebbe del tipo restituito dalla funzione D.
Se non si desidera/bisogno della funzione di avvolgimento automatico, cgi.d solo dà accesso alle funzioni di informazioni e di scrittura di base:
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;
Ma sì, la maggior parte della documentazione che esiste per la mia libreria è solo me ne parlo nei forum ... Penso che una volta che hai svolto una funzione non è difficile da capire, ma sono di parte!
edit: copia/incolla dal mio commento qui sotto in quanto è abbastanza rilevante per davvero ottenere Resty:
Io in realtà ho giocato con l'idea di avere gli URL mappa a oggetti e verbi passare attraverso: web.d anche include una classe ApiObject che va:/obj/name -> new Obj ("name"); e quindi chiama i metodi appropriati su di esso. Quindi chiamate GET/obj/name (nuovo Obj ("nome")). GET() ;, stesso per POST, PUT, ecc. Quindi/obj/name/foo calls (nuovo Obj ("nome"). Foo() ; con le stesse regole che ho descritto per le funzioni sopra.
Ma io non lo uso tanto quanto le funzioni normali per uno perché è ancora un po 'buggato .... ed è ancora un po' buggy perché io non 't usarlo abbastanza per sedersi e fare entrare tutto lol
lo si utilizza scrivendo una classe ApiObject e poi aliasing nella l'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/
}
e, naturalmente, definire l'oggetto:
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;
Quindi è possibile accedervi:
http://arsdnet.net/cgi-bin/apidemo2/obj/cool/
BTW la barra finale è obbligatoria: questo è uno degli insetti in circolazione non ho ottenuto intorno a fissare ancora. (Il codice della barra finale è più complicato di quanto dovrebbe essere, rendendo più difficile risolvere il problema.)
In ogni caso, è possibile visualizzare l'oggetto stesso come html tramite makeHtmlElement. Questo è un buon momento per mostrare altri formati:
http://arsdnet.net/cgi-bin/apidemo2/obj/cool/?format=table
tavolo, anche provare csv, e, naturalmente, JSON
http://arsdnet.net/cgi-bin/apidemo2/obj/cool/?format=json
o per il consumo macchina: http://arsdnet.net/cgi-bin/apidemo2/obj/cool/?format=json&envelopeFormat=json
e la proprietà è disponibile anche: http://arsdnet.net/cgi-bin/apidemo2/obj/cool/id
Un altro grosso bug in sospeso è che le funzioni Javascript generate automaticamente non possono accedere agli oggetti figlio. Funzionano solo su funzioni del livello superiore di ApiProvider. Un altro bug che è più difficile da risolvere di quanto possa sembrare, e non sono particolarmente motivato a farlo perché le funzioni di primo livello possono fare lo stesso. Ovviamente, puoi creare gli URL tu stesso sulla richiesta xmlhttp e accedervi in questo modo.
Diamo POST anche demo da schiaffi insieme una forma rapida:
http://arsdnet.net/cgi-bin/apidemo2/poster
è possibile inviare qualcosa e vedere il gestore POST infatti ripristinare il nome. (Nota che l'azione ha quella barra finale: senza di essa, ti reindirizza automaticamente! Devo davvero correggerla.)
In ogni caso, nonostante gli errori, il nucleo di esso funziona e potrebbe essere la cosa più vicina a REST D in piena regola ha adesso
Sfortunatamente tali domande "commerciali" non sono più adatte a SO. – user2864740
Non sto davvero facendo acquisti per i framework. Ci sono mille domande sul confronto tra framework web Java e idem per Python, Ruby, ecc. E credo che sia un linguaggio eccellente, D merita di avere una domanda di stackoverflow sul confronto dei suoi framework web. – Salil
Non penso che anche queste domande siano adeguate. Ma sono ciò che sono e esistono. Penso che questo sarebbe più adatto per una pagina Info sul tag D (la ricerca fatta e collegamenti informativi pubblicati, non una domanda). – user2864740