Domanda

Sto iniziando un progetto usando un'architettura Restful implementata in Java (usando il nuovo standard JAX-RS)

Stiamo programmando di sviluppare la GUI con un'applicazione Flex. Ho già riscontrato alcuni problemi con questa implementazione utilizzando il componente HTTPService (i codici di errore di risposta, l'accesso alle intestazioni ...).

Ognuno di voi ragazzi ha una certa esperienza in un progetto simile. È fattibile?

È stato utile?

Soluzione

Il problema qui è che molte delle discussioni sul web relative a questo problema sono vecchie di un anno o più. Sto lavorando a questa stessa ricerca in questo momento, ed è quello che ho imparato oggi.

Questo Articolo IBM Developer Works di agosto 2008 di Jorge Rasillo e Mike Burr mostra come realizzare un'app back-end front-end Flex / RESTful (esempi in PHP e Groovy). Bell'articolo Comunque, ecco il take away:

  • Il loro codice PHP / Groovy utilizza e si aspetta PUT e DELETE.
  • Ma il codice Flex deve usare POST, ma imposta l'intestazione HTTP X-Method-Override su DELETE (puoi fare lo stesso per PUT I presumo).
  • Nota che questo è non il metodo Proxy discusso sopra.

// Flex doesn't know how to generate an HTTP DELETE.
// Fortunately, sMash/Zero will interpret an HTTP POST with
// an X-Method-Override: DELETE header as a DELETE.
deleteTodoHS.headers['X-Method-Override'] = 'DELETE';

Cosa sta succedendo qui? il web server IBM intercetta e interpreta il " POST con DELETE " come ELIMINA.

Quindi, ho approfondito e ho trovato questo post e discussione con Don Box (uno dei ragazzi SOAP originali). Apparentemente si tratta di un comportamento abbastanza standard poiché alcuni browser, ecc. Non supportano PUT e DELETE, ed è una soluzione che esiste da un po 'di tempo. Ecco uno snippet, ma c'è molta più discussione.

  

" Se stavo costruendo un client GData, sinceramente mi chiedo perché mi preoccuperei di usare i metodi DELETE e PUT dato che X-HTTP-Method-Override funzionerà in più casi / implementazioni. quot &;

La mia conclusione è che se il tuo lato web supporta questa intestazione X-Method-Override, puoi usare questo approccio. I commenti di Don Box mi fanno pensare che sia abbastanza ben supportato, ma non l'ho ancora confermato.

Un altro problema riguarda la possibilità di leggere le intestazioni di risposta HTTP. Ancora una volta, da un post sul blog nel 2007 di Nathan de Vries , ne vediamo discusso. Ha seguito quel post sul blog e ha discusso con il suo commento:

  

" L'unica modifica sul fronte web è che le versioni più recenti di Flash Player (sicuramente quelle fornite con Flex 3 beta) ora supportano la proprietà responseHeaders su istanze di HTTPStatusEvent. "

Spero che ciò significhi che non è un problema ora.

Altri suggerimenti

Come molti hanno sottolineato HTTPService è un po 'semplicistico e non fa tutto quello che vuoi fare. Tuttavia, flash.net.* è solo zucchero in cima alle URLLoader classi come URLRequest, URLRequestHeader e <=>. Usandoli puoi assemblare la maggior parte delle richieste HTTP.

Quando si tratta di supportare altri metodi oltre a GET e POST, il problema risiede principalmente nel fatto che alcuni browser (ad esempio Safari) non li supportano e Flash Player si affida al browser per tutte le sue reti.

Vi sono alcune carenze nella capacità di Flex di agire come un semplice client RESTful.

I commenti qui sotto sono da questo blog :

  

Il problema è che la classe HTTPService ha   diverse limitazioni importanti:

     
      
  1. Sono supportati solo i metodi GET e POST (a meno che tu   usa FDS e imposta l'attributo useProxy su   vero)
  2.   
  3. Impossibile impostare le intestazioni della richiesta e non è possibile accedere alla risposta   intestazioni. Pertanto non sono in grado di farlo   accedere al corpo della risposta nel caso   di un errore.
  4.   
  5. HTTPService ottiene un codice di stato qualsiasi altro 200, considera   un errore. (evento 201, ahi !!). Il   FaultEvent non & # 8217; t fornisce informazioni   sul codice di stato qualsiasi risposta   corpo. Il client Flex non avrà   idea di cosa sia andato storto.
  6.   

Matt Raible ha anche dato un bella presentazione su REST con Rails, Grails, GWT e Flex che hanno alcuni buoni riferimenti collegati da esso.

Il fatto che sia fattibile o meno dipende davvero da quanto sei disposto a aggirare tramite il proxy, ecc.

Ho lavorato su una sostituzione open source per il componente HTTPService che supporta pienamente REST. Se interessati, è possibile trovare la versione beta (codice sorgente e / o libreria di runtime condivisa Flex compilata) e istruzioni qui:

http://code.google.com/p/resthttpservice/

La risposta breve è sì, puoi fare RESTful con Flex. Devi solo aggirare i limiti di Flash Player (meglio con le ultime versioni) e i limiti dello stack HTTP del browser contenente.

Abbiamo svolto lo sviluppo client RESTful in Flex per oltre un anno dopo aver risolto l'intestazione della richiesta HTTP di base e la mancanza di PUT e DELETE tramite l'approccio rails-esque? _method =. Tacky forse, ma ottiene il lavoro fatto.

Ho notato alcuni dei dolori delle intestazioni in un vecchio post sul blog http://verveguy.blogspot.com/2008/07/truth-about-flex-httpservice.html

Il supporto flessibile per REST è nella migliore delle ipotesi debole. Ho trascorso molto tempo a costruire un prototipo, quindi conosco la maggior parte dei problemi. Come accennato in precedenza, out of the box c'è solo il supporto per GET e POST. A prima vista sembra che sia possibile utilizzare la configurazione proxy in LiveCycle Data Services o Blaze per ottenere supporto per PUT e DELETE. Tuttavia, è un falso. La richiesta proveniente dalla tua app Flex sarà comunque un POST. Il proxy lo converte in PUT o DELETE sul lato server per ingannare il codice lato server. Ci sono anche altri problemi. Si sente credere che questo sia il meglio che Adobe potrebbe inventare. Dopo la mia valutazione abbiamo deciso di andare in un'altra direzione.

Sì, sono stato in grado di utilizzare POST e accedere alle intestazioni con questo componente:

http://code.google.com/p/as3httpclient/wiki/Links

Esempio

Sto lavorando su un'applicazione che si basa fortemente sulle chiamate REST tra Flex e JavaScript e Java Servlet. Risolviamo il problema del codice di errore di risposta stabilendo una convenzione di & Lt; status id = & Quot; XXX & Quot; name = quot &; YYYYYY quot &; > blocco che viene restituito in caso di errore, con ID errore approssimativamente associati a codici di errore HTTP.

aggiriamo le limitazioni di scripting cross-site utilizzando un servlet Java come proxy HTTP. Chiamate al proxy (che viene eseguito sullo stesso server che serve il resto del contenuto, incluso il contenuto Flex, invia la richiesta all'altro server, quindi restituisce la risposta al chiamante originale.

RestfulX ha risolto quasi tutto i problemi REST con Flex. Ha il supporto per Rails / GAE / Merb / CouchDB / AIR / WebKit e sono sicuro che sarebbe semplicissimo collegarlo alla tua implementazione Java.

Dima ha integrato anche la libreria AS3HTTPClient.

Dai un'occhiata!

In realtà stavo già usando Flex con un Rest-Style Framework. Come mbrevort già menzionato, i metodi PUT e DELETE non possono essere utilizzati direttamente. Invece stiamo facendo PUT tramite un POST e per DELETE stiamo usando un GET su una risorsa con un parametro URL come? Action = delete.

Questo non è uno stile di riposo al 100%, quindi non sono sicuro che funzioni con un'implementazione JSR 311. Sarà necessaria una certa flessibilità sul lato server per aggirare le restrizioni PUT e DELETE.

Per quanto riguarda la gestione degli errori, abbiamo implementato un servizio di errori. In caso di errore lato server, l'applicazione Flex può richiedere questo servizio di errore per ottenere il messaggio di errore effettivo. Questo è anche molto più flessibile della semplice mappatura dei codici di ritorno HTTP su messaggi statici.

Tuttavia, grazie allo scripting ECMA di Flex, lavorare con i servizi REST basati su XML è molto semplice.

REST è più un'ideologia che altro. Vai alle presentazioni REST e hanno distributori di coolaide.

Per le app Flex, stendere uno stack insieme al marshalling dei dati BlazeDS e AMF è più conveniente e più performante.

Il modo in cui l'ho gestito in passato è utilizzare un proxy PHP che gestisce le chiamate del servizio Web remoto e restituisce RTU JSON al client ..

Potrebbe essere il nuovo flex 4 è la risposta http://labs.adobe.com/technologies / flex4sdk /

Il libro Rotaie flessibili può essere utile - È una risorsa eccellente su come utilizzare Flex come client RESTful. Sebbene si concentri sull'uso di Flex con il framework Rails, credo che i concetti si applichino a qualsiasi framework RESTful. Ho usato questo libro per aggiornarmi rapidamente sull'uso di Flex con REST.

Lavoro a un grande progetto flessibile per Franklin Covey. Utilizziamo i servizi REST. Per supportare questo. Abbiamo creato un wrapper XMLHttpRequest. Utilizzando l'interfaccia esterna con alcuni gestori di eventi. Abbiamo aperto la libreria. Puoi verificarlo su https://github.com/FranklinCovey/AS3-XMLHttpRequest

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top