2010-02-18 6 views
33

Soy nuevo en JAX-RS y estoy tratando de usar Jersey para construir un servicio web RESTful simple.JAX-RS @PathParam Cómo pasar una cadena con barras, guiones y es igual a

Tengo 2 preguntas. Por favor, aclarar los siguientes:

  1. Estoy tratando de tener mi servicio web simple como este URL http://localhost:8080/SampleJersey/rest/inchi/InChIName

    El InChIName es una cadena como esta InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2- 5H,1H3,(H,11,12). ¿Cómo paso esto como @PathParam? Quiero decir que un String normal está funcionando bien, pero aquí hay barras, guiones y comas. ¿Cómo hago para ignorar esto? Traté de ponerlo entre comillas, pero eso no funcionó. ¿Cómo debería hacer esto?

  2. Necesito pasar ese InChI a otro servicio web y eso devuelve un XML como salida y quiero mostrar ese resultado XML como salida de mi servicio web. Si tengo @Produces("application/xml") ¿funcionará?

Este es mi código:

@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; 
    } 
} 

Respuesta

-1

usted debería ser capaz de utilizar una multa guión. No estoy seguro de cómo escapar de las barras.

9

Los parámetros deben ser URL encoded. Puede usar java.net.URLEncoder para esto.

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

El / luego serán traducidos a %2F.

+0

Muchas gracias. ¿Funcionará esto incluso para = (es igual a)? –

+1

Haga clic en el primer enlace. Verás que '=' también es un carácter reservado y que se codificará en '% 3D'. Además, es un poco de esfuerzo hacer un 'System.out.println (URLEncoder.encode (" = "," UTF-8 "));' en una aplicación de prueba con un 'main()';) – BalusC

+1

Gracias Balus. Todavía me falta algo.Si doy lo siguiente en la URL http RESTO: // localhost: 8080/SampleJersey/descanso/inchi/"hola-ahí" Casi todo bien quedan codificados. Pero si me presento en la barra allí como este http: // localhost: 8080/SampleJersey/descanso/inchi/"hola/no" Me recurso no se encuentra el error. ¿Cómo obtengo las barras codificadas aquí, y si quiero las barras como tales sin codificación, qué hago? –

3

Lo hice funcionar con @QueryParam() en lugar de @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; 
    } 
} 

Así, la estructura de la URL sería como este http://myrestservice.com/rest/inchi?inchiname=InChIhere

Con @PathParam leí en la API que no aceptará barras. Me pregunto si puedo usar cualquier expresión regular en @Path solo para ignorar todas las barras en la cadena que se ingresarán entre comillas "".

31

Esta es la forma de habilitar barras en params Ruta:

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

Gracias yegor - Usé este enfoque de definición de expresiones regex, pero encontré que solo funcionaba a través del @Path param (en lugar de @PathParam). @Path ("{inchiname:. +}"); [a través de jersey2] – ThomasMH

8

La siguiente debería funcionar:

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

(esto es una especie de mencionado en otra respuesta y comentario, sólo soy explicándolo en una respuesta separada para dejarlo en claro)

+0

Muchas gracias. Me salvó el día y resolvió mi problema perfectamente. Gracias un montón. –

+0

¿Puede decirnos cómo lograr lo mismo para los parámetros de consulta? –

+0

En mi humilde opinión, esta es la respuesta más concisa y precisa. – RockyMountainHigh

Cuestiones relacionadas