L'attuazione di una universale Web Service Architecture con Ajax

Questo articolo si concentra sulla costruzione di un'architettura di servizio AWeb. Nel precedente articolo, avete imparato a creare un'architettura globale che comprende le nozioni di base per la costruzione di servizi AWeb e la sua URL appropriati. Tuttavia, non ha spiegato i dettagli del servizio AWeb cosa fa e perché servizio AWeb dovrebbe fare quello che fa. Questo articolo delinea le linee guida su come sviluppare un Representational State Transfer (REST) basato su Web service. In particolare, esso copre i seguenti punti:

• Servizio AWeb Strutturare per risolvere un compito specifico

• Combinando i servizi Web per filtrare e modificare i dati

• Combinando i servizi Web per creare mashupProblemaDiamo un'occhiata ad un problema all'interno di un magazzino applicazione commerciale come un esempio di un problema nella costruzione di servizi web. Il problema è che un certo numero di clienti hanno bisogno di accedere in tempo reale e informazioni storiche ordine. Aggiunta di front-end AWeb servizio ti permette di sfruttare i server middleware socket senza apportare modifiche ad esso. Anche se può sembrare uno spreco di risorse per aggiungere un front-end ad un servizio Web in un contesto generale di servizio, ha senso qui. Questo articolo esaminerà il perché.

  

Parte Soluzione 1

L'implementazione della soluzione consiste nel prendere una delle tecnologie già esistenti e l'utilizzo di socket che la tecnologia per costruire servizi AWeb. Per scopi illustrativi, in questo articolo utilizza una singola tecnologia Java. Si poteva scegliere. NET o C + + la tecnologia attuale non è importante, perché il servizio Web esposto può essere consumato da qualsiasi tecnologia che è un servizio Web-aware. L'approccio iniziale alla costruzione del servizio Web è quello di definire le operazioni thegeneral e quindi implementare tali operazioni generale l'utilizzo di alcune tecnologie.

Nella visione di alto livello dell'architettura di scambio, un tipo di classe chiamata TradeServlet che implementa un servlet Java fornisce il servizio web. Per chi non è esperto di tecnologie Java, un servlet Java è un modo di attuare un gestore HTTP. TradeServlet esegue le richieste storico, richieste di dati real-time, e le richieste per utilizzare un'interfaccia denominata iTrader. Da una prospettiva di programmazione, utilizzando una interfaccia è l'approccio corretto, perché consente di utilizzare il pattern Bridge. Il pattern Bridge consente di disaccoppiare l'intenzione di commerciare con l'applicazione di trading. Nella visione di alto livello dei servizi Web di architettura, il ProviderTrader1 tipo implementa la chiamata della funzionalità, eventualmente tramite il socket layer. La teoria del modello Bridge consente di utilizzare una chiamata socket oggi come una soluzione di ripiego, ma domani ProviderTrader1 sostituire con una nuova implementazione (come la sostituzione del middleware con il servizio Web) senza dover cambiare l'attuazione del TradeServlet o l'interfaccia iTrader.

Il ProviderTrader1 classe

implementa l'interfaccia iTrader e fornisce un ponte tra il commerciante-sottosistema neutro alla presa sistema commerciale. Un altro provider potrebbero essere utilizzati per accedere ad un database legacy. Indipendentemente dal numero dei prestatori di servizio Web interagisce con l'operatore-sottosistema neutrale. E il commerciante-sottosistema neutrale interagisce con il socket sistema commerciale. In teoria, questo approccio è suono, ma si soffre troppo complessa. Il problema di questo approccio è una questione di messa a fuoco. Nell'esempio del sottosistema commerciante, l'attenzione è il sottosistema, e il livello di servizio Web è un add-on per il sottosistema commerciante. In teoria, il servizio Web add-on non è nemmeno necessaria, perché il sottosistema operatore gestisce tutto. Nel contesto di una domanda di Ajax servizio Web, questo è l'approccio sbagliato, perché il focus è il servizio Web, e non dovrebbe essere un add-on.

Parte Soluzione 2

La soluzione per il sottosistema operatore è quello di non definire né l'attuazione di un operatore-sottosistema neutro utilizzando una tecnologia specifica. Il sottosistema commerciante è trasformata in una serie di servizi web che si possono assemblare in un sottosistema. Servizio AWeb-based sottosistema commerciante richiede ancora un interfaccia, ma l'interfaccia è definita a livello di servizio Web HTTP. In termini architettonici, le implementazioni iTrader convertiti in servizi web. L'architettura si basa sul riutilizzo le implementazioni già esistenti di ProviderTrader1 e ProviderTrader2 direttamente dalla classe TradeServlet. Ogni applicazione fornisce un insieme di metodi, proprietà, e set di risultati che il professionista-sottosistema definisce neutrale. Utilizzando il servizio AWeb, i metodi, proprietà ed i set di risultati vengono convertiti in qualcosa che è un servizio Web-compatibile. Poi a un livello superiore, un'altra tecnologia assembla i servizi Web in un sottosistema commerciante.

L'attuazione del Trader-Universal Web ServiceIl servizio di trading Web è un esempio di cosa aspettarsi quando l'attuazione di una soluzione Web completa di servizi. In questo articolo si copre questi pezzi rimanenti:

• Definire gli URL

• Identificare i formati che possono essere inviati e ricevuti

• Come sostenere gli URL relativi

Definire gli URL per l'applicazione TraderContinuiamo con l'evoluzione del servizio di commercio elettronico e delineare i pezzi importanti, vale a dire l'URL e supportati i formati di dati. L'applicazione commerciante espone i seguenti URL di base:

 

• / servizi / controller

• / servizi / realtime

• / servizi / ordini

• / services/orders/trader123/order345

• / servizi / storico

/ servizi / controller è l'URL di base utilizzato per gestire il motore sul lato server. Il controllore URL permette di ripristinare il codice dietro il servizio Web manualmente. Ad esempio, nel caso della domanda di commerciante, / servizi / controller potrebbe collegare l'implementazione del servizio Web per la presa che fornisce l'interfaccia di negoziazione. È possibile utilizzare l'URL / servizi / controller / start per avviare il codice lato server, e si potrebbe utilizzare l'URL / servizi / controller / Stop per arrestare il codice lato server. Tuttavia, questo approccio non sarebbe utilizzabile, in quanto sembrerebbe che gli identificatori di start e stop sono risorse, che non lo sono. Confrontarlo con un interruttore della luce. Un interruttore della luce è una risorsa unica, che ha due stati: on e off. It does non sono due risorse, una per ogni stato. È possibile utilizzare i parametri di ricerca per avviare e arrestare il codice lato server. Per avviare il codice lato server, si esegue il POST verbo sulla URL / servizi / controller con l'interfaccia grafica del computer (CGI) parametri action = start. Per arrestare il codice del server, l'URL rimane lo stesso, così come il verbo, ma i parametri CGI modifica action = stop. Il verbo POST è appropriato, perché sei l'esecuzione di alcuni server-processo di lato, e quello che il processo deve fare dipende dai dati inviati. Chiamando il verbo GET sull'URL / servizi / controller restituisce lo stato del codice lato server.

Se si desidera controllare più parti di codice lato server nella vostra applicazione, quindi creare gli URL dei bambini come la seguente: / services/controller/code1 e / services/controller/code2. Le linee guida per avviare, fermare e recuperare lo stato dei singoli pezzi di codice server rimangono gli stessi. Spesso, pezzi di codice server-side richiedono le direttive di configurazione, come ad esempio il percorso della directory di base, il numero di thread per iniziare, e così via. Queste direttive di configurazione sono in genere memorizzati in un file di configurazione. Si dovrebbe essere in grado di specificare tali direttive quando si avvia il codice del server o si ferma. Per esempio, se si desidera specificare un numero di thread, allora si potrebbe utilizzare l'azione parametro CGI = start & THREADCOUNT = 12 per avviare il codice lato server.

Se avete la possibilità di definire le direttive di configurazione, allora possono essere interrogati e recuperati, quando lo stato del server è richiesto. Se si desidera eseguire una query il valore individuale di una variabile server, è possibile filtrare utilizzando i parametri di ricerca quali / servizi / controller? Status = THREADCOUNT + uptime. È possibile utilizzare l'URL di base / servizi / realtime per la gestione del real-time stock - ticker dati. Ad esempio, se siete interessati nel ticker GM, devi utilizzare l'URL / servizi / realtime / GM per recuperare le informazioni in tempo reale. Sembrerebbe che questo URL di base è il più semplice, ma la semplicità è fuorviante. Ad esempio, se gli utenti eseguono il GET URL / servizi / in tempo reale, ciò che viene restituito? Questa è una domanda difficile, perché ci si avvicina ai limiti di un pezzo di software. Dal punto di vista teorico, chiamando ottenere risultati in il ritorno dei dati in tempo reale per tutte le righe. Questo in teoria suona bene, ma è del tutto impraticabile. Ci sono letteralmente migliaia di stock su scambi multipli. Ottenere tutte le righe in una richiesta in tempo reale utilizzando una richiesta GET è praticamente irrealizzabile.

Questo è un esempio di un URL a cui la teoria e la pratica sono in conflitto. La soluzione non supporta l'URL radice come un riferimento ai dati in tempo reale. La radice URL viene utilizzato per restituire un elenco di tutte le opzioni disponibili collegamenti in tempo reale. La radice URL non è usato per indicare ciò che l'informazione in tempo reale, perché così facendo avrebbe richiesto a seguito di migliaia di righe. L'URL radice tornerà link dove è possibile recuperare i dati in tempo reale. Questo potrebbe significare tornare collegamenti a migliaia di titoli di borsa. Si potrebbe anche usare l'URL radice ritorno sia il link al ticker e una descrizione sintetica delle imprese. Ciò contribuirebbe a costruire un motore di ricerca, come maggior parte delle persone non si conosce il ticker, ma si conosce il nome della società. Delegare l'URL di root per singoli URL crea un problema in quanto il servizio Web non può gestire il tempo reale per l'alimentazione del tutti i titoli di borsa su tutte le borse.

Per dirla semplicemente, non è possibile tenere traccia di tutte le scorte in un singolo computer. Monitoraggio di tutte le scorte richiede enormi quantità di potenza che questo articolo non entreremo in. L'unica soluzione è quella di utilizzare una pista-se-ha chiesto una soluzione. In una track-se-ha chiesto una soluzione, le scorte sono rintracciati inizialmente per i dati in tempo reale. In tempo reale i dati verranno monitorate solo se un HTTP GET viene eseguito su una particolare azione. Un HTTP POST o PUT e DELETE non ha alcun senso in real-time dei mangimi, perché un reale feed tempo comprende i dati che va dal server al client. Il server non è interessato a tutte le informazioni dal client diversi da quelli che ticker per generare dati in tempo reale per l'. Se un verbo diverso GET viene eseguito, il server genera un errore HTTP 500.

/ servizi / ordini specifica l'URL di primo livello per l'elaborazione degli ordini. Nel contesto delle scorte, degli ordini fa uso di tutti i verbi HTTP. Si utilizza HTTP POST per inviare un ordine, HTTP PUT per modificare un ordine, HTTP GET per recuperare lo stato di un ordine, e HTTP DELETE per cancellare un ordine.

Ogni ordine sarà rappresentato come un identificatore univoco per esempio, / services/orders/1232445. L'identificatore unico non deve essere numerico, ma può essere alfanumerico o addirittura amore complicata Globally Unique Identifier (GUID). L'URL root può essere l'ospite di molti ordini, il che potrebbe significare letteralmente milioni di ordini. Per l'URL dell'ordine, è importante che si ha la possibilità di filtrare gli ordini in base ad uno status specifico. Si potrebbe essere tentati di organizzare gli ordini in base a una data, ma vorrei consigliare contro tale. Ogni volta che si sta creando una radice URL, i dati della raccolta dovrebbe essere accessibile nella sua forma naturale. In un'applicazione blog, è naturale per organizzare in base alla data. Tuttavia, l'ordine naturale di una domanda di azioni non è di data, ma piuttosto con ordinanza ID. Così, gli ordini di root URL dovranno letteralmente milioni di ordini ad esso associati. Se un'applicazione succede a chiedere per tutti gli ordini, il server necessità di dare tutti questi ordini. Nel caso di un database SQL, se una tabella ha milioni e milioni di dischi, e qualcuno esegue la query SELECT * FROM tabella, il database non si chiedono: "Sei sicuro di questo?" La banca dati andrà avanti e selezionare tutti i record, anche se potrebbe non essere efficace.

È possibile creare filtri per ottimizzare l'accesso agli ordini. Ad esempio, se si desidera trovare tutti gli ordini nel 2006, è possibile eseguire l'URL / servizi / ordini /? Anno = 2006. Si potrebbe anche trasformare i parametri di query in un URL di visualizzazione, come ad esempio / services/orders/2006. Se si utilizza il parametro di query o l'approccio URL vista dipende dalla vostra preferenza. Vi è un filtro che si rivelerà problematico, e si riferisce agli utenti. In ogni sistema di ordinamento, si dispone di più utenti. A stock-trading applicazione non è diverso. Ciò che rende uno stock di applicazione ordine di negoziazione più complicato è che un ordine non è soddisfatta automaticamente. Non potrebbe mai essere soddisfatta, e potrebbe anche essere annullata. Se un sistema per non avere la capacità di filtro per ogni operatore economico, si potrebbe incorrere in una situazione in cui un commerciante potrebbe aprire una posizione e un altro operatore si chiude una posizione.

In teoria, si potrebbe comprare e vendere una scorta futuro allo stesso tempo (chiamato lavaggio di negoziazione). Comprando e vendendo allo stesso tempo, vi sono né guadagnare né perdere, almeno diverso da quello a pagamento di intermediazione. Questa tecnica di acquisto e di vendita allo stesso tempo, attraverso due diversi broker è illegale, perché fa sembrare che l'azione su una posizione, quando in realtà non c'è. Pertanto, gli operatori sono legati ai loro ordini, e gli ordini sono legati ai loro operatori. Una raffinatezza logica degli ordini URL dovrebbe essere / servizi / ordini / [commerciante]. Questo URL raffinato dimostra che a volte è necessario creare gli URL che soddisfano le esigenze di altri, come, in questo caso, le esigenze del dipartimento giuridico.

Con questa raffinatezza degli URL, l'URL non root / servizi / ordini diventate obsolete? Tutto, compresi i parametri di ricerca e gli URL di visualizzazione, si applica ancora. La differenza è che l'URL per accedere alle informazioni dell'ordine conterrà l'identificatore univoco del commerciante. Supponendo che avete intenzione di utilizzare la raffinatezza per l'URL, andiamo attraverso ciò che i verbi singoli farà ai vari livelli URL. A livello di URL di root (/ servizi / ordini), solo il HTTP GET si applica. A questo livello, si può solo filtrare gli ordini che si desidera vedere. Non si può POST, perché la radice URL manca il commerciante ID, e non è possibile PUT, perché la radice URL è un URL di raccolta. Infine, non è possibile eliminare, perché ciò comporterebbe la soppressione di tutti gli ordini e gli operatori economici.

Un livello superiore, si dovrebbe avere l'URL di primo livello per un operatore individuale (/ servizi / ordini / venditori-abc). Alla URL radice di un singolo operatore, solo HTTP GET e POST applicano. Si usa GET per recuperare e potenzialmente filtrare tutti i mestieri che un operatore economico ha fatto. Per esempio, è possibile filtrare per operazioni effettuate in un determinato mese, anno, o il giorno. È possibile utilizzare gli URL / services/orders/trader-abc/2006 o / servizi / ordini / venditori-abc? Anno = 2006. Il verbo HTTP POST si applica, in quanto permette agli utenti di inviare un ordine, senza un ordine di ID. La presentazione del provvedimento restituisce l'URL in cui è possibile recuperare lo stato di un ordine. Se un POST HTTP per l'URL / servizi / ordini / venditori-abc viene inviato, l'URL / servizi / ordini / trader-abc/123456 potrebbe essere restituiti.

L'applicazione del verbo DELETE alla radice URL è un po 'complicato a causa di ciò che i mezzi verbo. Se si dovesse applicare il verbo DELETE, sarebbe eliminare tutti gli ordini alla URL di root. In pratica, questo è molto mal consigliato. Uno dei motivi per sostenere il verbo DELETE è quello di essere in grado di eliminare gli elementi in modo selettivo attraverso un parametro di query che agisce come un filtro. Ad esempio, per eliminare tutti gli ordini in un anno, è possibile utilizzare l'URL / servizi / ordini / venditori-abc? Anno = 2006. Si noti l'URL utilizzato per eliminare selettivamente è lo stesso che l'URL utilizzato per selezionare in modo selettivo. La differenza è il verbo (DELETE vs GET). Si tratta di un fenomeno comune che gli URL partita, ma presentano un comportamento diverso a seconda del verbo. Nel contesto del sistema del commercio, gli ordini di eliminazione sarebbe restrizioni. Se un ordine è in esecuzione, non si può cancellare l'ordine. PUT restanti verbo è per la maggior parte dei casi non è applicabile a livello URL root. Si utilizza il verbo PUT di inviare una rappresentazione completa della risorsa al server. Nel caso della radice URL, ciò significa che l'invio di tutti gli ordini al server. Il problema con l'invio di ordini per il server è che non è possibile inviare gli ordini completi. L'ordine è concluso, ma l'identificativo dell'ordine (calcolato al momento un ordine è inviato) è che manca. Pertanto, non è possibile utilizzare PUT per inviare un nuovo ordine al server.

Un'altra ragione per l'utilizzo di PUT sarebbe quella di modificare l'ordine esistente. In generale, si tratta di un uso legittimo, ma non è corretto nel contesto del sistema di scambio. Che cosa succede se si tenta di modificare un ordine che è attualmente in esecuzione? Non vi è alcun ricorso semplice e, quindi, nel contesto del sistema di ordinamento, la modifica di un ordine può causare più problemi che soluzioni. La soluzione del caso di scambio è quella di cancellare l'ordine e crearne uno nuovo. / Services/orders/trader123/order345 rappresenta uno URL di riferimento la risorsa ordine. In generale, è possibile applicare tutti i verbi HTTP, ma si deve creare limiti per riflettere i processi di business. Nel caso della domanda di operatore, non è possibile utilizzare il verbo messo su un nuovo ordine, perché l'applicazione per non consente di stabilire un ordine ID prima del tempo. Non è inoltre possibile inserire un ordine esistente, perché ciò significherebbe modificare l'ordine, e nel contesto di un sistema commerciale, di un ordine può eseguire o essere annullata. È possibile applicare e utilizzare il verbo DELETE per definire un annullamento dell'ordine. Un post a un ordine avrebbe un senso solo se il post rappresenta un ordine che è un annullamento. Un GET potrebbe essere utilizzato per recuperare lo stato di esecuzione di un ordine.

/ servizi / storico rappresenta un URL radice utilizzata per recuperare i dati storici dal middleware. Ottenere un feed storico è unico in quanto vi è un solo verbo applicabile vale a dire, GET. La parola storico implica qualcosa che già è accaduto, e non si può riscrivere la storia. Riscrivere la storia sarebbe verificare se si tenta di utilizzare il verbo PUT o DELETE. UN POSTO si applica se si utilizza il POST per creare una query sofisticate. Ad esempio, è possibile utilizzare un post a scansione e filtrare i dati storici in base a una serie di criteri. Per rendere il servizio Web storica quanto più efficace possibile, è necessaria la capacità di definire le query sofisticate. Riposo non è in grado di farlo, perché REST si basa sul protocollo HTTP. Questo non vuol dire che non è possibile utilizzare riposo per eseguire query sui dati, ma che è necessario scrivere le tubature. Per esempio, supponiamo che si desidera trovare tutte le scorte che oscillato in un intervallo specifico per cinque giorni su 10. Si avrebbe bisogno di codice di questo tipo di query sotto forma di una chiamata REST che i delegati a una query relazionale, supponendo che i dati sono memorizzati in un database relazionale. Un altro approccio è quello di utilizzare un database basato su XML, se aveste bisogno di a decidere in anticipo. Il vantaggio di memorizzare i dati in un database XML-based è che si può facilmente mappa del HTTP query per la gerarchia XML. Usando XML Query Language (XQL) e XPath sul database XML, è possibile eseguire le query sofisticate senza dover scrivere l'idraulico. È necessario ricordare che la potenza di un servizio Web storica risiede nel modo in cui si implementano le query.

Che formato di dati da inviare?Finora, tutti i servizi Web di esempio sono stati spiegati in termini di URL, ma non in termini di contenuto che viene accettato e ha generato. Nel caso della domanda di blogging introdotto all'articolo 4, il servizio Web di dati generati Atom utilizzando il tipo MIME application / atom + xml. Quando si costruisce RIPOSO servizi Web, il tipo MIME è importante, perché determina come i dati vengono ricevuti e inviati. Nel caso della domanda di blogging, se l'URL Atom è chiamato, verrà generato un flusso XML. In teoria, la strategia di sviluppo REST è quello di creare servizi AWeb che è technologyneutral e genererà il contenuto giusto per la giusta query.

un articolo presentato da Sonja Lande


Disclaimer:Il nostro sito non è responsabile per il contenuto di questo articolo. Webarticles è una risorsa gratuita di informazioni.
Importante: Questo articolo "L'implementazione di un universale Web Service Architecture usando Ajax" è stato tradotto da un software automatico. Ci dispiace per eventuali errori di ortografia che possono essersi verificati. Grazie per la vostra comprensione.


Online: 345 users browsing the articles directory