javax.ws.rs restful开发

2023-10-26

注解使用原文 https://blog.csdn.net/qq_22177809/article/details/86592660

java.ws.rs是jax-rs规范中定义的包名

jax-rs全称Java API for RESTful Services

jax-rs规范目前版本是2.0规范文档

jax-rs中定义了
一组启动方式 (以jee作为http容器 还是配合servlet作为http容器)
一组注解@GET, @POST, @DELETE, @PUT, @Consumes … 通过 POJO Resource类 提供Rest服务

如JSR规范定义Servlet是以继承HttpServlet 并重写doGet doPost do…方法一样 遵循这套标准都可以称为Servlet 写的Servlet程序 可以不经过任何修改放到任何实现Servlet容器中运行 写的jax-rs程序可以不经任何修改和任何jax-rs框架配合使用 而Spring MVC是以Servlet为http容器 并自己构建了一套Api没有遵循jax-rs规范

目前实现jax-rs标准的框架有很多

  • Apache CXF开源的Web服务框架
  • Jersey 由Sun提供的JAX-RS的参考实现
  • RESTEasy JBoss的实现
  • Restlet 由Jerome Louvel和Dave Pawson开发 是最早的REST框架 先于JAX-RS出现
  • Apache Wink 一个Apache软件基金会孵化器中的项目 其服务模块实现JAX-RS规范

@Path 注解位置 类注解 方法注解

标注class时 表明该类是个资源类 凡是资源类必须使用该注解
标注method时 表示具体的请求资源的路径

@GET @POST @PUT @DELETE 注解位置 方法注解

指明接收HTTP请求的方式属于get,post,put,delete中的哪一种 具体指定请求方式 是由客户端发起请求时指定

@Consumes 注解位置 方法注解

指定HTTP请求的MIME类型 默认是*/* 表示任意的MIME类型 该注解支持多个值设定 可以使用MediaType来指定MIME类型
MediaType的类型大致有
application/xml
application/atom+xml
application/json
application/svg+xml
application/x-www-form-urlencoded
application/octet-stream
multipart/form-data
text/plain
text/xml
text/html
@Path("{username"})
@Consumes({MediaType.APPLICATION_JSON})
public User getUser(@PathParam("username") String userName) {
    ...
}

@Produces 注解位置 方法注解

指定HTTP响应的MIME类型 默认是*/* 表示任意的MIME类型 同Consumes使用MediaType来指定MIME类型
@Path("{username"})
@Consumes({MediaType.APPLICATION_JSON})
@Produces(MediaType.APPLICATION_JSON)
public User getUser(@PathParam("username") String userName) {
    ...
}

@PathParam 注解位置 参数注解

配合@Path进行使用 可以获取URI中指定规则的参数
@GET
@Path("{username"})
@Produces(MediaType.APPLICATION_JSON)
public User getUser(@PathParam("username") String userName) {
    ...
}
// 浏览器请求http://ip:port/user/lilei时 userName值为lilei

@QueryParam 注解位置 参数注解

用于获取GET请求中的查询参数 实际上是url拼接在?后面的参数
@GET
@Path("/user")
@Produces("text/plain")
public User getUser(@QueryParam("name") String name,
                    @QueryParam("age") int age) {
    ...
}

// 浏览器请求http://ip:port/user?name=lilei&age=18时 name值为lilei age值为18 如需要为参数设置默认值 可以使用@DefaultValue

@FormParam 注解位置 参数注解

用于获取POST请求且以form(MIME类型为application/x-www-form-urlencoded)方式提交的表单的参数
@POST
@Consumes("application/x-www-form-urlencoded")
public void post(@FormParam("name") String name) {
    ...
}

@FormDataParam 注解位置 参数注解

用于获取POST请求且以form(MIME类型为multipart/form-data)方式提交的表单的参数 通常是在上传文件的时候

@HeaderParam 注解位置 参数注解

用于获取HTTP请求头中的参数值
@GET
@Path("/user/get")
public Response getUser(@HeaderParam("user-agent") String userAgent) {
    ...
}
// 这里获取user-agent的值

@CookieParam 注解位置 参数注解

用于获取HTTP请求cookie中的参数值
@GET
public String callService(@CookieParam("sessionid") String sessionid) {
    ...
}

@MatrixParam 注解位置 参数注解
可以用来绑定包含多个property (属性)=value(值) 方法参数表达式 用于获取请求URL参数中的键值对 必须使用’;'作为键值对分隔符

@Path("/books")
public class BookService {
    @GET
    @Path("{year}")
    public Response getBooks(@PathParam("year") String year,
            @MatrixParam("author") String author,
            @MatrixParam("country") String country) {
        ...
    }
}
// 请求1 "/books/2012/" 解析结果为 年份 2012 作者 null 国家 null
// 请求2 "/books/2012;author=andih" 解析结果为 年份 2012 作者 andih 国家 null

注意MatrixParam与QueryParam的区别
QueryParam请求url的格式为 url?key1=value1&key2=value2&…
MatrixParam请求url的格式为 url;key1=value1;key2=value2;…

@DefaultValue

配合前面的参数注解等使用 用来设置默认值 如果请求指定的参数中没有值 通过该注解给定默认值

注解位置 参数注解

@POST
@Path("/user/add")
@Consumes({MediaType.APPLICATION_FORM_URLENCODED})
@Produces({MediaType.APPLICATION_JSON})
public Response addUser(@FormParam("username") String userName, @DefaultValue("0") @FormParam("age") int age, @DefaultValue("1") @FormParam("sex") int sex){
    ...
}

注意 DefaultValue指定的值在解析过程中出错时(@DefaultValue(“test”) @QueryParam(“age”) int age) 将返回404错误

@BeanParam 注解位置 参数注解

如果传递的较多 使用@FormParam等参数注解一个一个的接收每个参数可能显得太臃肿 可以通过Bean方式接收自定义的Bean 在自定义的Bean中字段使用@FormParam等参数注解 只需定义一个参数接收即可
public class MyBean {
	@FormParam("myData")
	private String data;
	@HeaderParam("myHeader")
	private String header;
	@PathParam("id")
	public void setResourceId(String id) {...}
        ...
}

@Path("myresources")
public class MyResources {
	@POST
	@Path("{id}")
	public void post(@BeanParam MyBean myBean) {
		...
	}
	...
}

@Context 注解位置 属性注解 参数注解

用来用来解析上下文参数 和Spring中的AutoWired效果类似 通过该注解可以获取ServletConfig ServletContext HttpServletRequest HttpServletResponse和HttpHeaders等信息
@Path("/user")
publicclass Resource {
    @Context
    HttpServletRequest req;
    @Context
    ServletConfig servletConfig;
    @Context
    ServletContext servletContext;

    @GET
    public String get(@Context HttpHeaders hh) {
        MultivaluedMap<String, String> headerParams = hh.getRequestHeaders();
        Map<String, Cookie> pathParams = hh.getCookies();
    }
}

@Encoded
禁止解码 客户端发送的参数是什么样 服务器就原样接收

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javax.ws.rs restful开发 的相关文章

随机推荐

  • SQL注入时order by 后面加数字的作用

    此文章是记录本人对知识理解的随手笔记 内容不肯定百分百正确 如有错误望指出并谅解 结论 order by 后面加数字可以判断服务器在查询某个表时所查询的列数 原理 1 当sql查询语句为 select username password u
  • Ruby 2.1 GC策略

    对象管理主要涉及 Profiling support 增加了hook用于状态获取 专用API 分代式GC引入
  • c++将模板实现放在cpp,外部使用模板的方法(demo,gcc+msvc(动态库))

    参考https blog csdn net mincheat article details 77987740 一般情况 模板函数被外部其他引用会提示找不到函数 原因是 编译本身这个cpp的时候 没有发现有引用的地方 那么就不会被编译 而编
  • 使用QEMU+GDB调试Linux驱动程序

    前提 QEMU中已经添加了设备支持 能够正常insmod rmmod xxx ko 然后才能有接下来的调试 step1 打开如下编译选项然后编译Linux内核 CONFIG DEBUG INFO y CONFIG RANDOMIZE MEM
  • 毕业设计 - STM32公交站牌系统

    文章目录 1 简介 2 主要器件 2 1 ILI9320 2 2 串口GPRS模块 2 3 相关传感器 3 实现效果 4 设计原理 5 部分实现代码 6 最后 1 简介 Hi 大家好 学长今天向大家介绍一个单片机项目 STM32公交站牌系统
  • 简易agv小车自动导航控制协议

    1 获取地图栅格 2 实体化 转换 3 行走指令 调度优先处理 1 比如 前面 10 100米 行走指令序列 2 以 后面 0 10分钟 行走指令序列 4 处理栅格 5 转换计算成行走操作 1 速度 2 绝对移动位置 3 错误操作 4 阻碍
  • ubuntu的APT介绍

    介绍 apt是一款安装包管理工具 在ubuntu下可以使用apt命令进行软件包的安装 删除 清理等 ubuntu软件操作的相关命令 sudo apt get update 更新源 sudo apt get install package 安
  • 对AI未来和人类关系的一点思考!

    人 由大脑和身体组成 大脑里存在着人类的意识 身体给大脑提供能量 而这能量是由外界的食物提供的 从而 人体加工食物转化成能量 大脑加工能量 转化成意识 而意识表现在计算能力和创新能力两个方面 计算能力是量变的积累 创新能力是质变的飞跃 创新
  • OSPF实验

    我们坠落 破碎 掉入深渊 但我们终会被托起 被治愈 我们无所畏惧 OSPF部分实验 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 没关系的 大家都会做错选择 会莫名其妙掉眼泪 走在路上会突然崩溃 但这并不影响我们去看
  • 栈越界攻击分析

    1 栈帧简介 之前几期学习分享了关于栈帧系列知识的学习 我们知道函数调用过程中 每一个调用函数都是以栈帧为单位 在其内存空间上做相关操作 每一个调用函数的栈帧存有其返回地址 调用函数结束后 根据返回地址回到上层栈帧空间 直至main 函数的
  • c++访问私有成员变量和私有成员函数的常用方法

    类的对象不能直接访问类声明的私有成员变量 否则破坏了信息隐藏的目的 在C 中 为了防止某些数据成员或成员函数从外部被直接访问 可以将它们声明为private 这样编译器会阻止任何来自外部非友元的直接访问 1 私有成员变量的四种访问方法 1
  • Allegro 为无网络的pin创建并添加网络

    学习笔记 allegro在直接进行PCB绘制而不导入网表的情况 或者在不修改原理图更新网表的情况下 添加无网络的pin并为其创建或指定网络 1 为元件创建网表 logic gt part logic 在 Parts list 添加所需要的元
  • 什么是面向对象编程(OOP)?

    Java 程序员第一个要了解的基础概念就是 什么是面向对象编程 OOP 玩过 DOTA2 一款推塔杀人的游戏 吗 里面有个齐天大圣的角色 欧洲战队玩的很溜 国内战队却不怎么会玩 自家人不会玩自家的神话英雄 实在有点悲哀 我们用 Java 定
  • Java集合

    Java集合 在开发实践中 对于数据的处理十分重要 而经常面对方方面面的数据是常态 所需要的数据形式 保存数据 变换数据长度 更改数据类型 就需要数据结构来实现 需要一些能够动态增长长度的容器来保存我们的数据 Java中对于各种数据结构的实
  • 线程池EterfreeA/ThreadPool的使用

    在GitHub上有个线程池项目 地址为 https github com EterfreeA ThreadPool 开源 它的License为AFL 3 0 这里了解学习下 code中有较多的中文说明 1 Core hpp 一些define
  • RecyclerView列表九宫格瀑布流,多条目,SpringView实现上拉下拉刷新

    首先导入RecyclerView的依赖 SpringView的依赖 compile com android support recyclerview v7 25 3 1 compile com liaoinstan springview l
  • 虚函数及虚函数表

    虚函数及虚函数表 各个类对象共享类的虚函数表 每个类对象有个虚函数指针vptr 虚函数指针vptr指向虚函数表 对于只有一个虚函数表的情况 虚函数 简单的说 每一个含有虚函数 无论是其本身的 还是继承而来的 的类都至少有一个与之对应的虚函数
  • 基于MATLAB的车牌识别系统+GUI界面的毕业设计(完整源码+课题报告+说明文档+数据)

    文章目录 1 前言 2 实现步骤 1 颜色信息提取 2 倾斜校正 3 字符分割 4 字体识别 5 语音播报 6 存储数据 3 总结 4 完整源码下载 1 前言 近年来 随着交通现代化的发展要求 汽车牌照自动识别技术已经越来越受到人们的重视
  • 浅谈为什么一个java源文件中只能有一个public类?

    第一 只有一个public类 浅谈为什么一个java源文件中只能有一个public类 每个编译单元 文件 只能有一个public 类 这么做的意思是 每个编译单元只能有一个公开的接口 而这个接口就由其public 类来表示 java程序的入
  • javax.ws.rs restful开发

    注解使用原文 https blog csdn net qq 22177809 article details 86592660 java ws rs是jax rs规范中定义的包名 jax rs全称Java API for RESTful S