2011-12-17 14 views
5

Ho bisogno di creare un server di riposo e client.Creazione di un server java con riposo

Mi sono imbattuto in questo tutorial che utilizza le prese. Voglio essere in grado di utilizzare le chiamate REST, possibilmente HTTP, perché i client saranno effettivamente in lingue diverse.

Invece di utilizzare Socket api da java.net.*, cosa devo usare? se uso Socket API posso usare C++ e php per comunicare con questo server? o dovrei andare con REST?

tutte le indicazioni sono gradite.

+1

[REST] (http://en.wikipedia.org/wiki/REST) ​​ha davvero senso solo nel contesto di HTTP. È possibile utilizzare prontamente _principles_ dietro REST utilizzando un'API autoprogrammata che viene eseguita direttamente su socket non elaborati, ma a quel punto non sarebbe REST. – sarnold

+0

beh, voglio poter comunicare tramite HTTP. ma non sono sicuro di quale API utilizzare. possibilmente su una porta personalizzata. – DarthVader

risposta

6

C'è un sacco di cose che è possibile utilizzare per creare servizi di riposo, e quindi possono essere consumati praticamente da qualsiasi cosa. Di particolare suggestione è la possibilità di colpirli nel tuo browser web, solo perché siamo tutti così familiari con loro.

Quando ho bisogno di una soluzione di riposo 'rapida e sporca', io uso Restlet - Non dirò che è l'unica soluzione, ma è la più semplice con cui abbia mai lavorato. Ho letteralmente detto in un incontro "Potrei avere XYZ in 10 minuti." Qualcun altro nella riunione mi ha chiamato su questo, e abbastanza sicuro, utilizzando Restlet I è stato in grado di ottenere un server REST funzionante in esecuzione con le (molto semplici) funzionalità che ho detto che avrei partecipato alla riunione. Era piuttosto lucido.

Ecco un server barebone con un metodo, che restituisce l'ora corrente. L'esecuzione del server e il raggiungimento di 127.0.0.1:12345/sample/time restituiranno l'ora corrente.

import org.restlet.Application; 
import org.restlet.Component; 
import org.restlet.Context; 
import org.restlet.Restlet; 
import org.restlet.data.Protocol; 
import org.restlet.routing.Router; 

/** 
* This Application creates an HTTP server with a singple service 
* that tells you the current time. 
* @author corsiKa 
*/ 
public class ServerMain extends Application { 

    /** 
    * The main method. If you don't know what a main method does, you 
    * probably are not advanced enough for the rest of this tutorial. 
    * @param args Command line args, completely ignored. 
    * @throws Exception when something goes wrong. Yes I'm being lazy here. 
    */ 
    public static void main(String...args) throws Exception { 
     // create the interface to the outside world 
     final Component component = new Component(); 
     // tell the interface to listen to http:12345 
     component.getServers().add(Protocol.HTTP, 12345); 
     // create the application, giving it the component's context 
     // technically, its child context, which is a protected version of its context 
     ServerMain server = new ServerMain(component.getContext().createChildContext()); 
     // attach the application to the interface 
     component.getDefaultHost().attach(server); 
     // go to town 
     component.start(); 

    } 

    // just your everyday chaining constructor 
    public ServerMain(Context context) { 
     super(context); 
    } 

    /** add hooks to your services - this will get called by the component when 
    * it attaches the application to the component (I think... or somewhere in there 
    * it magically gets called... or something...) 
    */ 
    public Restlet createRoot() { 
     // create a router to route the incoming queries 
     Router router = new Router(getContext().createChildContext()); 
     // attach your resource here 
     router.attach("/sample/time", CurrentTimeResource.class); 
     // return the router. 
     return router; 
    } 

} 

Ed ecco la 'risorsa ora corrente' che utilizza:

import org.restlet.representation.Representation; 
import org.restlet.representation.StringRepresentation; 
import org.restlet.resource.Get; 
import org.restlet.resource.ServerResource; 

/** 
* A resource that responds to a get request and returns a StringRepresentaiton 
* of the current time in milliseconds from Epoch 
* @author corsiKa 
*/ 
public class CurrentTimeResource extends ServerResource { 

    @Get // add the get annotation so it knows this is for gets 
    // method is pretty self explanatory 
    public Representation getTime() { 
     long now = System.currentTimeMillis(); 
     String nowstr = String.valueOf(now); 
     Representation result = new StringRepresentation(nowstr); 
     return result; 
    } 
} 
+0

è necessario capire qualcosa, mi interessa creare un server, proprio come il server HTTP, con JAVA, personalizzato, che ascolterà le connessioni in entrata tramite le chiamate REST. posso usare Restlet per quello? – DarthVader

+1

Sì, è possibile farlo con Restlet. – corsiKa

+0

Lo proverò. Grazie. – DarthVader

2

JAX-RS è l'API per REST in Java. Ci sono molte implementazioni, ma le principali sono Jersey (l'implementazione di riferimento), Apache's CXF e Restlet.

0

Direi di andare con un servizio RESTful basato su HTTP. Sta rapidamente diventando uno standard defacto. Controlla la mia risposta a questo similar question per pro e contro.

1

Scarica JBoss 7. Problema risolto.

Heres un servizio riposante:

@Path("/myservice") 
public class MyService { 

    @GET 
    @Produces(MediaTypes.TEXT_PLAIN) 
    public String echoMessage(@QueryParam("msg") String msg) { 
     return "Hello " + msg; 
    } 
} 

Creare una guerra. Distribuire. Apri il browser e vai su http://myserver/myapp/myservice?msg=World. Fatto!

+0

lol. ho sentito jboss fa schifo. – DarthVader

+0

Chi te l'ha detto? JBoss 6 ha avuto seri problemi di prestazioni, ma a parte questo la serie è sempre stata solida. JBoss 7 è un killer. – Perception

+0

ho bisogno di un barattolo per quello? quale API devo usare per fare questo? – DarthVader

0

Questo è il migliore in circolazione. Spring MVC che ha molte funzionalità di REST in sé. Questo richiede solo un singolo file jar da includere. E tu sei pronto per usare tutte le sue capacità. Anche semplice come il ragazzo sotto spiegato in JBOSS e molto più flessibilità.

http://java.dzone.com/articles/spring-30-rest-example

2

Di solito, non si crea un server. È possibile creare un'applicazione Web e distribuirla sul server o sul contenitore servlet. Alcuni contenitori servlet sono incorporabili nella tua applicazione web, ad es. Molo. I contenitori servlet gratuiti Poppular sono Tomcat, Glassfish, Jetty, ecc.

Per Restlet, non è un contenitore servlet. È un framework che ti consente di creare un'applicazione wep con stili RESTful. Quindi questo non dovrebbe essere confuso.

Se si decide di utilizzare il contenitore servlet, il problema è come è possibile creare un'applicazione Web con gli stili RESTful. REST non è una tecnologia: è un principio di progettazione. È un concetto di come dovresti creare l'interfaccia.

Il progetto di REST è stateless quindi non è necessario memorizzare lo stato della transazione. Tutte le informazioni da una richiesta dovrebbero essere sufficienti per produrre un responso al cliente.

Esistono diverse strutture servlet che consentono di impiantare facilmente gli stili REST. Alcuni di questi sono molto sofisticati, ad es. Quadro di primavera.

0

Uso JBoss 6 con RestEasy. Ho creato un tutorial situato a here. Spero che questo ti aiuta.

0

Siete inoltre invitati a vedere il mio esempio molto semplice per l'implementazione del server REST here.