Questo è "anti-pattern" e dovrei smettere di usarlo o è un design intelligente?


10

Fondamentalmente ho iniziato a fare quanto segue durante la creazione di un servizio REST:

  1. HTML è richiesto
  2. il servizio restituisce la pagina Web desiderata ma senza la "risorsa" richiesta, ad es. dati
  3. la pagina web contiene JavaScript che invia la richiesta AJAX allo stesso servizio (tipo di contenuto diverso)
  4. il servizio restituisce quindi i dati effettivi (JSON) e la pagina li visualizza

Da un lato sembra inefficiente (2 richieste), ma poi sono stato usato "prestazioni non preoccupano", il che significa che l'app interna a basso traffico e i siti Web sono semplici e si caricano rapidamente.

Il motivo per cui ho finito con questo è che la pagina web può essere quindi quasi pura HTML + JavaScript e non è richiesta quasi alcuna roba sul lato server, soprattutto senza loop, per creare tabelle e roba del genere (che penso sia molto brutta rispetto a cose come slickgrid), ad es. separazione dei dati e vista.

Ora, prima di usare questo, è una buona idea o dovrei semplicemente smettere di farlo?


2
Se vuoi trascorrere più tempo con i tuoi cari e desideri avere tempo libero per divertirti negli hobby o perseguire obiettivi personali, per l'amor di Dio: non programmare applicazioni come quelle! Ma se ti piace stare a tarda notte e nei fine settimana in ufficio mantenendo tonnellate di codice "intelligente", allora adatta a te stesso.
Tulains Córdova,

3
Puoi elaborare in modo specifico ciò che ritieni negativo? Contesto: questa non è una bestia da 10 Mio LOC che è fondamentale per il business. È più simile a <5000 LOC e non importa se non funziona per un paio di giorni. Sì, non è che dovrei fare cose schifose, quindi elaborte quello che pensi sia così male.
beginner_

@begginer_ Ogni software inizia in piccolo. Quello che descrivi somiglia a una Rube Goldberg Machine: il martello colpisce l'uomo, l'uomo lancia un biscotto, un pappagallo afferra biscotti e inclina un vaso, ecc.
Tulains Córdova,

Il motivo è spesso quello di migliorare le prestazioni, in cui è possibile eseguire il recupero dei dati con più richieste simultanee a quelli che potrebbero essere server diversi. Non sembra che questo valga per il tuo caso.
user16764

Come si utilizza questo servizio da client come script o da curl? Quelle cose non hanno interpreti javascript. È per un servizio solo browser?
Bryan Oakley,

Risposte:


17

Se si richiede una risorsa e non contiene i dati, non si tratta del servizio REST. Il servizio che fornisce i dati effettivi in ​​json potrebbe essere, ma la parte HTML no. Per un'applicazione Web non importa.

La tecnica funziona, ma devi essere consapevole delle sue limitazioni:

  1. I motori di ricerca non interpretano JavaScript, quindi il sito implementato in questo modo non sarà indicizzabile da Google e simili. Per l'applicazione interna non ha importanza, per il pubblico di fronte sarebbe importante.
  2. Gli utenti con esigenze speciali (come quelli che utilizzano terminali Braille) utilizzano browser speciali che sono piuttosto limitati e potrebbero non interpretare correttamente JavaScript.

Vorrei anche notare che il codice che genera l'HTML è sostanzialmente lo stesso, indipendentemente dal fatto che funzioni lato server o lato client. Hai una scelta molto più ampia di lingue e framework sul lato server e sono sicuro che ci sono anche molti equivalenti di slickgrid.

Puoi e dovresti comunque mantenere la separazione dei dati e la visualizzazione sul lato server. Il sistema di template può, e dovrebbe, semplicemente prendere i dati come struttura di dati o addirittura json (specialmente se il servizio effettivo è in una lingua diversa rispetto al sistema di template) ed espandere semplicemente un template con quei dati.

E no, non sto pensando a PHP; è il sistema di template meno capace là fuori (anche se ce ne sono alcuni migliori costruiti sopra di esso). Sto pensando a Genshi o XSLT o qualcosa di ancora più avanzato che fornisce widget web.


Scrivo fat-client in JavaScript, che fanno esattamente questo. Ma è probabilmente una cattiva idea per i normali siti Web.
K ..

Perché non è REST?
Dagnelies,

1
Se si distingue tra i "dati" che formano l'applicazione (HTML, JS, CSS, ecc.) E i "dati" che l'applicazione visualizza (JSON), la parte JSON è REST, ma la parte che carica "codice" non è ' t. Se vedi tutto più astratto, entrambi lo sono.
K ..

2

Non c'è niente di sbagliato nel fare questo, purché tu ti assicuri di strutturare il codice in modo pulito. Puoi persino servire il contenuto statico ad esempio da un Apache anziché dal tuo servizio web.


2
Apache è un problema eccessivo per il contenuto statico. Ci sono server molto più veloci. Il più popolare sembra essere Nginx .
Jan Hudec,

5
Quello era un esempio, niente di più.
Steven Schlansker,

2

Questa è una buona pratica. Ed è sempre attivo, come sottolinea @JanHudec, chiamarlo servizio REST è sbagliato. Ma molti siti Web fanno esattamente questo per i motivi che sottolinea.


1
... e la ragione principale che molti lo fanno è perché l'interazione dei dati è attraverso servizi / JSON in ogni caso , quindi è probabile migliore per gestire tutti i tuoi dati di interazione nello stesso modo. (cioè se stai usando AJAX per aggiornare una tabella ... dovresti anche usarla per costruire la tabella in primo luogo.)
Chad Thompson

@ChadThompson Sì, trovo che molte volte se non costruisco cose come questa in primo luogo, da qualche parte lungo la linea riceverò una richiesta di funzionalità per aggiornare dinamicamente la pagina in base al fatto che il client fa qualcosa - che significa che una semplice implementazione ora porta sia il client che il server a sapere come costruire la pagina. In primo luogo è più semplice costruirlo sul client.
Tacroy,

1

Non lo definirei un anti-schema, quello che stai descrivendo è più o meno un cliente grasso , non completamente diverso dai servizi come Trello. La responsabilità iniziale del server è di inviare il DOM e tutte le risorse necessarie per far funzionare il client. Ho lavorato su progetti simili nell'automazione dei data center e nel monitoraggio della rete.

Il client inizia come un DOM sparso, estrae alcuni dati tramite XHR (a volte tramite JSONP) e infine si collega a un server socket. Un esempio ancora più semplice sarebbe un'applicazione di chat.

L'unica ragione per non farlo è che può essere estremamente difficile da ottenere. Se sei a tuo agio con la programmazione funzionale asincrona e tutte le gare e le altre sfide che può presentare, non avrai problemi a mantenerlo. Ancora più importante, non avrai problemi a scriverlo in modo che altre persone possano eventualmente mantenerlo.

Se il pensiero di aggiungere più funzionalità inizia a spaventarti, o inizi a scoprire che il debug è un incubo, allora potresti voler considerare altri metodi in produzione mentre continui a sperimentare e imparare.

È un design valido purché non si stia scavando un buco per te. Se hai goccioline di JS casuali dappertutto invece di un'interfaccia pulita, probabilmente vorrai ripensare o fare il progetto in modo diverso. La maggior parte delle funzioni definite per l'esecuzione una volta caricate tutte le risorse deve essere anonima e immessa da un'interfaccia pulita. Se non lo sono, potresti avere problemi.


Cosa intendi con "JS casuale"? Nel mio caso quello che stai descrivendo sopra è molto più complesso di quello che ho (alcuni campi di input e una tabella (slickgrid) o le schede dell'interfaccia utente jquery). Questo è tutto. Circa 200 LOC per pagina.
principiante_15

0

come ha detto @Jan Hudec, il tuo approccio non può assolutamente essere chiamato REST. Anche se potrebbe essere la parte in cui il client richiede una risorsa. È meglio se il client gestisce la parte di presentazione, come backbonefa. Comunica con il server REST per le risorse e le visualizza usando views.


0

Potrebbe essere un anti-pattern, ma penso che sia anche il futuro delle applicazioni web. Invece di confonderti con JavaScript, tuttavia, dovresti usare almeno una libreria di modelli. Una soluzione migliore è un framework MVC sul lato client come AngularJS (che mi capita di utilizzare ora).

Per alcuni altri riferimenti, ecco un post sul blog popolare che confronta diversi framework, ed ecco un sito che implementa lo stesso programma usando più framework.

Inoltre: i commenti di Jan Hudec sull'interazione tra i motori di ricerca e gli screen reader sono validi. Se stai lavorando su un sito di e-commerce (dove conta la pagerank), probabilmente non vorrai utilizzare i framework lato client. Ma per le app interne, di solito non si tratta di preoccupazioni.


grazie mai sentito di AngularJS. Ma penso che per le mie esigenze attuali sia troppo.
principiante_15

0

Quello che fai suona bene! Tuttavia, se le tue risposte json contengono HTML, allora stai perdendo tempo.

Un altro punto però è che il tuo stupido client dovrebbe probabilmente ottenere i suoi dati json da un progetto diverso. Dovresti mirare ad una corretta separazione tra cliente e servizio, quindi avrai un servizio RESTful adeguato

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.