SpringMVC - dispatcher servler 的 url 模式样式
Posted
技术标签:
【中文标题】SpringMVC - dispatcher servler 的 url 模式样式【英文标题】:SpringMVC - dispatcher servler's url pattern style 【发布时间】:2015-06-29 19:44:21 【问题描述】:我正在尝试使用 springMVC
构建一个宁静风格的 API。
在为 springMVC 的DispatcherServlet
配置 url-pattern 时,似乎有 2 个选择,我需要一些建议。
选择 A:
配置模式为:<url-pattern>*.action</url-pattern>
和动作使用路径如@RequestMapping("/role/add.action")
选择 B:
配置模式为:<url-pattern>/api/*</url-pattern>
和动作使用路径如@RequestMapping("/api/role/add")
我更喜欢使用没有后缀的样式,但在这种情况下,我需要添加子路径。
但我不确定哪个更适合在作为后端以提供 RESTful API 的项目中使用,并以浏览器/ios/android 作为其客户端。
可能有一个选项 C,但我不确定:
配置模式为:<url-pattern>/*</url-pattern>
和动作使用路径如@RequestMapping("/role/add")
在这种情况下,内置的 servlet 将被覆盖,例如 jsp 将无法正常工作。
但是我没有jsp
,而且像html / js / css / image / document / music / video
这样的静态资源都放在nginx
服务的另一个端口或服务器上,对tomcat的请求只通过json数据提供ajax服务。
那么在这种情况下使用选项 C 是否合适,或者它有一些不好的副作用?
【问题讨论】:
我推荐使用 Spring Boot,这样就不需要任何此类规范。 @chrylis 你能帮忙解释一下spring boot如何解决这个问题吗?因为根据servlet规范,我找不到既没有后缀也没有子路径的模式,同时可以避免覆盖内置的servlet。 Spring Boot 为您管理整个容器,因此您根本不必指定任何路径。 【参考方案1】:如果您的目标是 restful api,我的选择是第二个,因为您在 url 中识别资源;说你必须管理一个角色资源,你应该有一些像这样的映射:
@RequestMapping("/api/role" method = RequestMethod.POST)
插入一个新角色(可能是api不允许这样做)
@RequestMapping("/api/role/roleId" method = RequestMethod.PUT)
更新现有角色
@RequestMapping("/api/role/roleId" method = RequestMethod.DELETE)
删除角色
@RequestMapping("/api/role" method = RequestMethod.GET)
检索角色(您可以通过查询字符串实现一些过滤器)
这同样适用于其他资源(用户等),命名架构相同。
我会避免使用选项 C,因为我认为如果您的应用还发布了不使用 api 的 Web 界面,最好为 api 提供专用映射
【讨论】:
【参考方案2】:对于 RESTful 服务,我将选择 选择 B,考虑使用 REST
执行 CRUD
操作。您可以将url-pattern
映射为,
config pattern as: <url-pattern>/api/*</url-pattern>
所以要执行 add ,您只需确保从页面发布 JSON 对象并具有类似 /api/add
的 url
在删除的情况下,您可以简单地遵循相同的操作。考虑您将使用其 id 从列表中删除 object
。你可以简单地理解为,
/api/delete/$id
并像处理它,
@RequestMapping(value="/id", method=RequestMethod.GET)
【讨论】:
好建议,但是很多api有多个参数,所以我还是需要把参数放在?
之后或者http正文中,我猜。
是的,它也取决于 API。为什么不将对象用于多个参数。
我有时会使用对象,但这也仅适用于部分 API,例如,搜索服务可能具有来自多个模型的更多参数。以上是关于SpringMVC - dispatcher servler 的 url 模式样式的主要内容,如果未能解决你的问题,请参考以下文章
Spring MVC 无法正确配置 Dispatcher Servlet
applicationContext.xml和dispatcher-servlet.xml的区别
iOS-多线程dispatch_semaphore_t dispatch_queue_t dispatch_group_t常见用法场景