2010-02-18 36 views
33

Tôi mới dùng JAX-RS và tôi đang cố gắng sử dụng Jersey để xây dựng một RESTful Webservice đơn giản.JAX-RS @PathParam Làm thế nào để vượt qua một chuỗi với dấu gạch chéo, dấu gạch nối & bằng quá

Tôi có 2 câu hỏi. Hãy làm rõ những:

  1. Tôi cố gắng để có webservice đơn giản của tôi như URL này http://localhost:8080/SampleJersey/rest/inchi/InChIName

    Các InChIName là một chuỗi như InChI=1S/C9H8O4/c1-6(10)13-8-5-3-2-4-7(8)9(11)12/h2- 5H,1H3,(H,11,12) này. Làm thế nào để vượt qua điều này như là một @PathParam, tôi có nghĩa là một chuỗi bình thường đang làm việc tốt nhưng ở đây có dấu gạch chéo, dấu gạch nối và dấu phẩy. Làm thế nào để làm cho nó bỏ qua những điều này. Tôi đã thử đặt nó trong dấu ngoặc kép, nhưng điều đó không thành công. Làm thế nào tôi nên làm điều này?

  2. Tôi cần chuyển số InChI đó cho một dịch vụ web khác và trả về XML dưới dạng đầu ra và tôi muốn hiển thị đầu ra XML đó làm đầu ra của Webservice. Nếu tôi có @Produces("application/xml") nó có hoạt động không?

Đây là mã của tôi:

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

Trả lời

-1

Bạn sẽ có thể sử dụng một mỹ gạch nối. Không chắc chắn về cách thoát khỏi dấu gạch chéo.

9

Các thông số phải là URL encoded. Bạn có thể sử dụng java.net.URLEncoder cho việc này.

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

/ sau đó sẽ được dịch sang %2F.

+0

Cảm ơn rất nhiều. Điều này sẽ làm việc ngay cả đối với = (bằng)? –

+1

Nhấp vào liên kết thứ nhất. Bạn sẽ thấy rằng '=' là một ký tự dành riêng và nó sẽ được mã hóa thành '% 3D'. Ngoài ra, đó là một chút nỗ lực để chỉ làm một 'System.out.println (URLEncoder.encode (" = "," UTF-8 "));' trong một ứng dụng thử nghiệm với một 'chính()';) – BalusC

+1

Cảm ơn Balus. Tôi vẫn còn thiếu cái gì đó.Nếu tôi đưa ra những điều sau đây trong URL REST http: // localhost: 8080/SampleJersey/rest/inchi/"hello-there" evrything được mã hóa tốt. Nhưng nếu tôi giới thiệu dấu gạch chéo trong đó như thế này http: // localhost: 8080/SampleJersey/rest/inchi/"hello/there" tôi nhận được tài nguyên không tìm thấy lỗi. Làm thế nào để có được các dấu gạch chéo được mã hóa ở đây, và nếu tôi muốn các dấu gạch chéo như vậy mà không được mã hóa những gì tôi phải làm gì? –

3

Tôi đã làm việc này bằng cách sử dụng @QueryParam() thay vì @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; 
    } 
} 

Như vậy cấu trúc URL sẽ là như thế này http://myrestservice.com/rest/inchi?inchiname=InChIhere

Với @PathParam Tôi đọc trong API rằng nó sẽ không chấp nhận dấu gạch chéo. Tôi tự hỏi liệu tôi có thể sử dụng bất kỳ Biểu thức chính quy nào trong @Path chỉ để bỏ qua tất cả dấu gạch chéo trong chuỗi sẽ được nhập vào dấu ngoặc kép "" hay không.

31

Đây là cách bạn cho phép chéo trong params đường dẫn:

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

Cảm ơn yegor - Tôi đã sử dụng cách tiếp cận định nghĩa regex này, nhưng thấy nó chỉ hoạt động thông qua tham số @Path (thay vì @PathParam). @Path ("{inchiname:. +}"); [qua jersey2] – ThomasMH

8

Sau đây nên làm việc:

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

(Đây là loại đề cập trong một câu trả lời và bình luận, tôi chỉ đặt nó trong một câu trả lời riêng để làm rõ nó)

+0

Cảm ơn bạn rất nhiều. Nó đã cứu ngày của tôi và giải quyết vấn đề của tôi một cách hoàn hảo. Cảm ơn nhiều. –

+0

Bạn có thể cho biết cách đạt được điều tương tự cho các tham số truy vấn không? –

+0

Theo quan điểm khiêm tốn của tôi, đây là câu trả lời ngắn gọn và chính xác nhất. – RockyMountainHigh

Các vấn đề liên quan