web-dev-qa-db-ja.com

JAX-RS @PathParamスラッシュ、ハイフン、および同等の文字列を渡す方法

私はJAX-RSを初めて使用し、ジャージーを使用して単純なRESTful Webサービスを構築しようとしています。

2つの質問があります。これらを明確にしてください:

  1. このURL http://localhost:8080/SampleJersey/rest/inchi/InChINameのような単純なWebサービスを取得しようとしています。

    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を出力として返す必要があり、その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;
    }
}
37

これは、パスパラメータでスラッシュを有効にする方法です。

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

TomcatはURLの%2Fを受け入れません: http://Tomcat.Apache.org/security-6.html 。この動作をオフにすることができます。

19
simonox

パラメーターは RLエンコード である必要があります。これには Java.net.URLEncoder を使用できます。

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

/%2Fに変換されます。

10
BalusC

以下が機能するはずです。

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

(これは別の回答とコメントで言及されているようなもので、明確にするために別の回答に明示的に入れているだけです)

10
AmanicA

@PathParamではなく@QueryParam()を使用してこれを機能させました。

@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で正規表現を使用できるかどうか疑問に思っています。

3