RESTEasy 系列 Chapter 5 @PathParam

本文介绍了@PathParam注解在RESTful服务中的应用,详细解释了如何利用此注解将URI路径片段变量映射到方法参数,包括基本类型、自定义类型及复杂使用场景,并探讨了@PathParam与PathSegment的结合使用。

 

@PathParam是一个参数注解,允许你映射URI路径片断变量到你的方法调用。

 

 

@Path("/library")
public class Library {

   @GET
   @Path("/book/{isbn}")
   public String getBook(@PathParam("isbn") String id) {
      // search my database and get a string representation and return it
   }
}

 

 

 

这允许你在你的资源当中,在你的URI内嵌入变量识别。在上面的示例,我们需要访问的书本信息通过一个URI参数isbn,你注入的该参数的类型可以是基本类型,一个字符串,或者任何拥有接收一个字符串参数构造方法的Java对象,或一个静态的接收字符串参数的valueOf方法。示例中,比方说我们希望isbn是一个真正的对象,我们可以这样做:

 

   @GET
   @Path("/book/{isbn}")
   public String getBook(@PathParam("isbn") ISBN id) {...}


   public class ISBN {
      public ISBN(String str) {...}
   }

 

 

或者代替公共的String构造方法,拥有一个valueOf方法:

 

 

  public class ISBN {
     
     public static ISBN valueOf(String isbn) {...}
  }

 

 

5.1. 高级 @PathParam 和正则表达式

 

 

@PathParams有一些更复杂的使用在上一章节中没有讨论。

 

你可以指定一个或多个路径参数嵌入到一个URI片断,下面是一些示例:

 

1. @Path("/aaa{param}bbb")
2. @Path("/{name}-{zip}")
3. @Path("/foo{name}-{zip}bar")

 

所以,一个URI "/aaa111bbb" 将匹配 #1. "/bill-02115" 将匹配 #2. "foobill-02115bar" 将匹配#3.

 

之前我们讨论了你能够如何使用正则表达式到@Path的value:

 

@GET
@Path("/aaa{param:b+}/{many:.*}/stuff")
public String getIt(@PathParam("param") String bs, @PathParam("many") String many) {...}

  

下面的这些请求,让我们看看"param" 和 "many" 将会是哪些值:

 

Table 5.1. 

Request

param

many

GET /aaabb/some/stuff

bb

some

GET /aaab/a/lot/of/stuff

b

a/lot/of

 

 

5.2. @PathParam 和 PathSegment

 

关于URI路径调用规范有一个非常简单抽象的片断检查,

javax.ws.rs.core.PathSegment:

 

 

 

public interface PathSegment {

    /**
     * Get the path segment.
     * <p>
     * @return the path segment
     */
    String getPath();
    /**
     * Get a map of the matrix parameters associated with the path segment
     * @return the map of matrix parameters
     */
    MultivaluedMap<String, String> getMatrixParameters();
    
}

 

 

 

 

你要以在resteasy注入一个

PathSegment代替你的

@PathParam的value:

 

 

 

 

 

 

   @GET
   @Path("/book/{id}")
   public String getBook(@PathParam("id") PathSegment id) {...}

 

 

 

 

 

 

这是非常有用的,如果你有一堆的

@PathParam使用矩阵参数。矩阵参数的想法是,它们是嵌入在URI路径片断的任意一对name-value对集合。PathSegment对象允许您访问这些参数,也看到

MatrixParam。

 

 

一个矩阵参数的例子:

 

 

 

 

GET http://host.com/library/book;name=EJB 3.0;author=Bill Burke

 

矩阵参数的基本思想是,它代表的资源是可寻址的,来自于它们的属性以及它们的原始id。

@PathParam和@Param是用于后端接受前端传递的参数的两种常用方式。在post请求中,我们可以使用@Param来接受参数,在get请求中,我们可以使用@PathParam来接受参数。 关于@Param,它可以直接获取request中的参数值。如果需要获取的参数值存在一些特殊符号,比如字符串中包含分号等,我们可以优先使用@PathParam来获取参数值。此外,即使参数后面的值为空,@Param也能够获取到空值,不会报异常。 关于@PathParam,它可以直接获取URI模板中的参数值。但是需要注意的是,如果参数值带有后缀名,@PathParam会忽略掉后缀名,如果需要获取后缀名,我们需要使用正则表达式来获取。 个人总结来说,如果只传递单个参数,我们可以直接将参数放在URL地址中,使用@PathParam会更方便。如果传递多个参数或者不同类型的参数,我建议使用@PathParam。但是需要注意的是,为了安全起见,使用@PathVariable会更安全一些,因为@PathParam是从地址栏中获取参数值,而@PathVariable是从request请求中提取参数值。 所以,我们需要根据具体需求来选择使用@PathParam还是@Param。\[2\] #### 引用[.reference_title] - *1* [RestEasy+用户指南----第5章.@PathParam](https://blog.youkuaiyun.com/nndtdx/article/details/6870449)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [@PathVariable与@PathParam的区别](https://blog.youkuaiyun.com/weixin_44548147/article/details/117734195)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [@Param和 @PathParam](https://blog.youkuaiyun.com/qq_45807943/article/details/117708502)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值