2013-10-16 13 views
5

Vorrei utilizzare per creare un'applicazione web RESTful.Quali sono le opzioni per i quadri REST in D?

Quali sono i progetti più attivamente mantenuti e contribuiti che vale la pena considerare? Un breve confronto di questi framework web con vantaggi e svantaggi sarà piacevole.

La mia ricerca mi ha portato a un solo progetto, che sembra una struttura eccellente: vibe.d

Ci sono altri progetti che sono il minimo in natura come ?

+1

Sfortunatamente tali domande "commerciali" non sono più adatte a SO. – user2864740

+0

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

+0

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

risposta

6

Al momento della stesura di questo testo non esiste un framework per la creazione di veri servizi web RESTful che io conosca. Tuttavia, dovresti essere in grado di crearne facilmente uno sopra lo vibe.d o lo Adam's web modules che ha già menzionato sopra.

+0

In realtà ho giocato con l'idea che gli URL fossero mappati agli oggetti e che i verbi passassero: web.d include anche 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 normali funzioni per uno perché è ancora un po 'buggato .... ed è ancora un po' buggy perché non lo faccio usalo abbastanza per sederti e adattare tutto! lol –

+0

nota che ho appena modificato alcune cose sulla funzionalità ApiObject nella mia risposta –

+1

Nota la parola * true * davanti al termine RESTFul ...;) Credo umilmente al 60% di framework e API che mettono REST nelle loro descrizioni non sono veramente REST ... Non fraintendermi, non penso che sia male, solo che è vero * RESTfulness * è difficile ... – DejanLekic

7

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

+0

un'altra funzionalità appena documentata di cgi.d è che puoi testare dalla riga di comando, quindi se hai eseguito: "./apidemo2 GET/obj/cool /" ti mostrerebbe l'output proprio lì. C'è un commento in cgi.d su uno dei costruttori che spiega alcune delle opzioni. Cerca "--cookie" in cgi.d e vedrai quel commento. Altre opzioni della riga di comando sono stringa di query o parametri POST, a seconda del metodo. –

+1

Ti vedo scrivere tanto testo sul tuo framework, perché non cogliere l'occasione per rispondere a una domanda e creare documentazione allo stesso tempo. Alla fine non dovrai iniziare con "l'atmosfera è meglio documentata". –

+0

sì, ho intenzione di creare un sito web e un blog o qualcosa del genere ma non ci sono ancora arrivato. Trascorro molto tempo a rispondere alle domande, ma in realtà non riesco a piacermi con una configurazione del sito web; Odio tutti loro. –

Problemi correlati