2010-02-18 5 views
33

Sono nuovo di JAX-RS e sto cercando di utilizzare Jersey per creare un semplice servizio Web RESTful.JAX-RS @PathParam Come passare una stringa con barre, trattini e uguali anche

Ho 2 domande. Si prega di chiarire questi:

  1. Sto cercando di avere la mia semplice webservice come questo URL http://localhost:8080/SampleJersey/rest/inchi/InChIName

    L'InChIName è una stringa come questo InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2- 5H,1H3,(H,11,12). Come faccio a passare questo come @PathParam, voglio dire che una normale stringa sta funzionando bene ma qui ci sono barre, trattini e virgole. Come faccio a ignorarli. Ho provato a metterlo tra virgolette, ma non ha funzionato. Come dovrei farlo?

  2. Ho bisogno di passare quello InChI a un altro webservice e che restituisce un XML come output e voglio visualizzare quell'output XML come output del mio Webservice. Se ho @Produces("application/xml") funzionerà?

Questo è il mio codice:

@Path("/inchi") 
public class InChIto3D { 
    @GET 
    @Path("{inchiname}") 
    @Produces("application/xml") 
    public String get3DCoordinates(@PathParam("inchiname")String inchiName) { 
     String ne=""; 
     try{ 
      URL eutilsurl = new URL(
         "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?" 
         + "db=pccompound&term=%22"+inchiName+"%22[inchi]"); 
      BufferedReader in = new BufferedReader(
            new InputStreamReader(eutilsurl.openStream())); 
      String inputline; 
      while ((inputline=in.readLine())!=null) 
       ne=ne+inputline; 
     }catch (MalformedURLException e1) { 
     }catch (IOException e2){ 
     } 
     return ne; 
    } 
} 

risposta

-1

si dovrebbe essere in grado di utilizzare una multa trattino. Non sono sicuro di come sfuggire alle barre.

9

I parametri devono essere URL encoded. È possibile utilizzare java.net.URLEncoder per questo.

String encodedParam = URLEncoder.encode(unencodedParam, "UTF-8"); 

Il / sarà poi tradotto a %2F.

+0

Grazie mille. Funzionerà anche per = (uguale a)? –

+1

Fare clic sul primo collegamento. Vedrai che '=' è anche un carattere riservato e che sarà codificato in '% 3D'. Inoltre, è un po 'di sforzo fare semplicemente un 'System.out.println (URLEncoder.encode (" = "," UTF-8 "));' in un'applicazione di test con un 'main()';) – BalusC

+1

Grazie Balus. Mi manca ancora qualcosa.Se fornisco il seguente URL REST http: // localhost: 8080/SampleJersey/rest/inchi/"hello-there", tutto viene codificato correttamente. Ma se introduco la barra come in questo http: // localhost: 8080/SampleJersey/rest/inchi/"ciao/lì", ricevo l'errore non trovato nella risorsa. Come faccio a ottenere le strisce codificate qui, e se voglio le barre in quanto tali senza essere codificato, cosa devo fare? –

3

Ho ottenuto che questo funzioni utilizzando @QueryParam() anziché @PathParam.

@Path("/inchi") 
public class InChIto3D { 
    @GET 
    //@Path("{inchiname}") 
    @Produces("application/xml") 
    public String get3DCoordinates(@QueryParam("inchiname") String inchiName) { 
      String ne=""; 
      try{ 
       URL eutilsurl = new URL(
         "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?" 
         + "db=pccompound&term=%22"+inchiName+"%22[inchi]"); 
       BufferedReader in = new BufferedReader(
           new InputStreamReader(eutilsurl.openStream())); 
      String inputline; 
      while ((inputline=in.readLine())!=null) 
       ne=ne+inputline; 
      }catch (MalformedURLException e1) { 
      }catch (IOException e2){ 
      } 
      return ne; 
    } 
} 

Così la struttura degli URL sarebbe come questo http://myrestservice.com/rest/inchi?inchiname=InChIhere

Con @PathParam ho letto l'API che non accetterà barre. Mi chiedo se posso usare qualsiasi espressione regolare in @Path solo per ignorare tutte le barre nella stringa che verrebbero inserite tra virgolette "".

31

Questo è il modo di abilitare barre in params percorso:

@Path("{inchiname : .+}") 
public String get3DCoordinates(@PathParam("inchiname")String inchiName) 
+2

Grazie a yegor: ho utilizzato questo approccio di definizione regolare, ma ho rilevato che funzionava solo tramite il parametro @Path (anziché @PathParam). @Path ("{inchiname:. +}"); [via jersey2] – ThomasMH

8

Il seguente dovrebbe funzionare:

@GET 
@Path("{inchiname : (.+)?}") 
@Produces("application/xml") 
public String get3DCoordinates(@PathParam("inchiname")String inchiName) { 

(Questa è una sorta di menzionato in un'altra risposta e commentare, io sono solo esplicitamente metterlo in una risposta separata per chiarire)

+0

Grazie mille. Mi ha salvato la giornata e ha risolto il mio problema perfettamente. Grazie mille. –

+0

Puoi dire come ottenere lo stesso per i parametri di ricerca? –

+0

A mio modesto parere, questa è la risposta più concisa e accurata. – RockyMountainHigh