restful URI 匹配原理,它是咋构成的?

JAX-RS URI组成
本文介绍JAX-RS RESTful Web服务中资源URI的构成方式。包括部署配置、CXF Servlet URL模式、JAX-RS server地址及JAX-RS资源类的@Path注解。这些元素共同决定了客户端如何访问特定资源。

如果你写了一个JAX-RS (restful 风格的web service)程序,放在了tomcat 等web service上面,那restful 客户端程序或者browser 如何知道你的资源地址 URI呢?

下面就说下这个JAX-RS web service对外提供的URI是由那几部分组成的。


/*

 * How Request URI is Matched?
Lets assume 

1) you have a web application called 'rest'  , in this example, it is  'rest.war'  deployed on tomcat server.


2) CXFServlet's url-pattern is "/test/*"  (here it is defined in web.xml as below example shows)

web.xml 的内容如下:


.......

<servlet>
<servlet-name>CXF315</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXF315</servlet-name>
<url-pattern>/WSRest/*</url-pattern>

</servlet-mapping>

...


3)  Finally, jaxrs:server's address is "/bar" 
(it is defined in Spring's bean xml such as applicationContext.xml as below shown) 


<bean id="WSRestfulBean" class="cxf.server.MyServiceImpl"/>   
<jaxrs:server id="userService" address="/userws">
<jaxrs:serviceBeans>
  <ref bean="WSRestfulBean"/>
</jaxrs:serviceBeans>
</jaxrs:server>

4) 后面就是你的JAX-RS (restful web service)的代码提供的@Path参数了

例如

 RS.java


@Path("/")
public interface EmployeeWSRestFulService {

@Path("/getUserById/{id}/")
@GET
@Produces({"application/json","application/xml"}) //json is high priority
User getUserById(@PathParam("id") String id);

@Path("/")
@GET
//json is high priority, default is application/xml
@Produces({"application/json","application/xml"}) 
List<User> findAllUsers();

@Path("/updateUser/")
@PUT
@Consumes({"application/json","application/xml"})   
Response updateUser(User user);


@Path("/getUserById/{id}/")
@GET
@Produces({"application/json","application/xml"}) //json is high priority
User getUserById(@PathParam("id") String id);


@Path("/")
@GET
//json is high priority, default is application/xml
@Produces({"application/json","application/xml"}) 
List<User> findAllUsers();


...

}

这样 带有  /test/WSRest/userws/ 的 Http Get 请求就会被List<User> findAllUsers()处理,而带 /test/WSRest/userws/getUserById/1/  Get HTTP request 就会被getUserById("1")处理。

注意这里的root @Path是"/",如果不是"/",则上面的URI还会加一级。例如,假设上面的代码是这样:

@Path("/thb")
public interface EmployeeWSRestFulService {

//里面内容不变

}

则  带 URI /test/WSRest/userws/ thb/getUserById/1/ 的  HTTP Get  才会被getUserById("1")处理了。


Requests like /rest/test/bar or /rest/test/bar/baz will be delivered to one of the resource classes in a given jaxrs:server 
endpoint. For the former request to be handled, a resource class with @Path("/") should be available, in the latter case - 
at least @Path("/") or a more specific @Path("/baz").
 * 
 */
### Restful API 的定义 Restful API 是一种基于 Representational State Transfer (REST) 原则的应用程序编程接口。它通过一组原则和指南设计 Web 服务,提供标准化的数据交互方式,通常以 JSON 或 XML 格式传递数据[^2]。 RESTful API 遵循客户端-服务器架构模式,运行于 HTTP 协议之上。其核心理念在于资源的统一表示形式、无状态的操作机制以及清晰的功能划分。这种设计使得 RESTful API 成为了现代 Web 开发中的主流技术之一,因其简单易用且兼容性强而受到开发者青睐[^3]。 --- ### Restful API 的工作原理 #### 资源定位 RESTful API 将每一个可操作的对象视为一个 **资源**,并通过 URI(Uniform Resource Identifier)唯一标识这些资源。例如,在社交媒体平台中,`/users/{id}` 可用于获取特定用户的详细信息。 #### 请求方法 RESTful API 利用了标准的 HTTP 方法来执行不同的操作: - `GET`: 获取指定资源的信息。 - `POST`: 创建新的资源实例。 - `PUT/PATCH`: 更新现有资源的内容。 - `DELETE`: 删除某个资源[^3]。 每种方法对应着具体的业务逻辑处理流程,从而实现了功能上的分离与规范化管理。 #### 数据交换格式 在实际应用过程中,RESTful API 大量采用轻量化结构化数据格式——主要是 JSON 和 XML 来完成前后端之间高效稳定的消息传输过程[^2]。其中 JSON 因为其简洁性和易于解析的特点成为首选方案。 以下是使用 Rust 中 warp 框架创建的一个简单的 RESTful API 示例代码片段展示如何响应 GET 请求并返回 JSON 数据: ```rust use warp::Filter; #[tokio::main] async fn main() { let hello = warp::path!("hello" / String) .map(|name| format!(r#"{{ "message": "Hello {}" }}"#, name)); warp::serve(hello).run(([127, 0, 0, 1], 3030)).await; } ``` 此段代码展示了如何设置路由 `/hello/:name` 并当收到匹配路径时生成包含问候语句作为 body 的 http response 给调用者[^4]。 --- ### 总结 综上所述,Restful API 不仅限定了服务间通讯的标准还促进了软件系统的模块化发展;凭借其强大的适应能力满足了当今互联网环境下日益增长的服务需求^.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值