JAX-RS @PathParam如何传递包含斜杠、连字符和等号的字符串

40

我刚接触 JAX-RS,正在尝试使用 Jersey 构建简单的 RESTful Web 服务。

我有两个问题,请明确回答:

  1. 我想创建一个简单的 Web 服务,它的 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 传递给另一个 Web 服务,并将其返回的 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;
    }
}
5个回答

41

这是如何在路径参数中启用斜杠的方法:

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

2
谢谢yegor - 我使用了这种正则表达式定义方法,但发现它只能通过@Path参数(而不是@PathParam)工作。@Path("{inchiname: .+}"); [通过jersey2] - ThomasMH

19

12

以下应该有效:

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

(这在另一个回答和评论中已经提到,我只是明确地将其放在了一个单独的回答中以使其更清晰)


非常感谢。它解决了我的问题,拯救了我的一天。非常感谢。 - Vinod Jayachandran
你能告诉我如何实现查询参数的相同效果吗? - Vinod Jayachandran
在我看来,这是最简洁准确的答案。 - RockyMountainHigh

10

这些参数应该进行URL编码。您可以使用java.net.URLEncoder进行此操作。

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

然后,/ 将被翻译为 %2F


1
点击第一个链接。您会发现=也是一个保留字符,它将被编码为%3D。此外,在测试应用程序中使用main()只需执行System.out.println(URLEncoder.encode("=", "UTF-8"));即可。 - BalusC
@BalusC BalusC,如果Tomcat、Apache和JBoss不支持%2f怎么办? 我可以启用它,但我不想这样做(出于安全原因)。 - Oleg Pavliv
@BalusC:如何处理包含斜杠(/)和空格( )的路径参数? URLEncoder.encode("a b/1", "UTF-8") 的结果是 a+b%2F1,这对于查询参数是正确的,但对于路径参数我预期得到 a%20b%2F1 - raho

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 在API中,使用@PathParam时,我读到它不接受斜杠。我想知道是否可以在@Path中使用任何正则表达式,以忽略输入在引号""中的字符串中的所有斜杠。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接