2010-02-18 5 views
33

Я новичок в JAX-RS, и я пытаюсь использовать Джерси для создания простого веб-сервиса RESTful.JAX-RS @PathParam Как передать строку со слэшами, дефисами и равными тоже

У меня есть 2 вопроса. Просьба уточнить эти:

  1. Я пытаюсь получить мой простой веб-сервиса, как этот URL http://localhost:8080/SampleJersey/rest/inchi/InChIName

    InChIName является строка, как этот InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2- 5H,1H3,(H,11,12). Как передать это как @PathParam, я имею в виду, что нормальная строка работает нормально, но здесь есть слэши, дефисы и запятые. Как я могу заставить их игнорировать их. Я попытался положить его в кавычки, но это не сработало. Как мне это сделать?

  2. Мне нужно передать это InChI в другой webservice и возвращает XML в качестве вывода, и я хочу отобразить этот вывод XML в качестве вывода моего Web-сервиса. Если у меня есть @Produces("application/xml"), это сработает?

Это мой код:

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

ответ

-1

Вы должны быть в состоянии использовать дефис штраф. Не уверен, как избежать косой черты.

9

Параметры должны быть URL encoded. Вы можете использовать java.net.URLEncoder.

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

/ затем будет переведен на %2F.

+0

Большое спасибо. Будет ли это работать даже для = (равно)? –

+1

Нажмите на 1-ю ссылку. Вы увидите, что '=' также является зарезервированным символом и что он будет закодирован в '% 3D'. Кроме того, немного усилий, чтобы просто сделать 'System.out.println (URLEncoder.encode (" = "," UTF-8 "));' в тестовом приложении с 'main()';) – BalusC

+1

Спасибо Балус. Я все еще что-то упускаю.Если я укажу следующее в URL REST http: // localhost: 8080/SampleJersey/rest/inchi/"hello-there", evrything получит кодировку в порядке. Но если я представляю косую черту, например http: // localhost: 8080/SampleJersey/rest/inchi/"hello/there", я получаю ресурс, который не найден. Как получить косые черты, закодированные здесь, и если я хочу, чтобы слэши как таковые не были закодированы, что мне делать? –

3

Я получил это для работы, используя @QueryParam(), а не @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; 
    } 
} 

Таким образом, структура URL будет как этот http://myrestservice.com/rest/inchi?inchiname=InChIhere

С @PathParam я прочитал в API, что он не будет принимать косой черты. Мне интересно, могу ли я использовать любое регулярное выражение в @Path, чтобы игнорировать все слэши в строке, которые будут введены в кавычки "".

31

Это, как включить косую черту в пути Params:

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

Спасибо yegor - я использовал этот подход определения регулярных выражений, но нашел, что он работает только через параметр @Path (вместо @PathParam). @Path ("{inchiname:. +}"); [через jersey2] – ThomasMH

8

Следующая должно работать:

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

(Это вроде упомянутого в другой ответ и комментарий, я просто явно ставя его в отдельный ответ, чтобы он дал понять)

+0

Большое вам спасибо. Это спасло мой день и решило мою проблему. Огромное спасибо. –

+0

Можете ли вы сказать, как добиться того же результата для параметров запроса? –

+0

По моему скромному мнению, это самый краткий и точный ответ. – RockyMountainHigh

 Смежные вопросы

  • Нет связанных вопросов^_^