Open zh826256645 opened 8 years ago
RESTful Web Service
RESTful Web Service 的准确翻译应该是 REST 式的 WEB 服务,我们通常简称为 Web 服务
JAX-RS 是 Java 领域的 REST 式的 Web 服务的标准规范
资源类是接收 REST 请求并完成响应的核心类 资源类是由 REST 服务的“提供者”来调度的 这一概念类似其他框架中定义的 Servlet 类,该类会将请求分派给指定的 Controller/Action 类来处理 REST 中的这个提供者,即 JAX-RS2 中定义的 Application 以及 Servlet
设计和开发 REST 式的 Web 服务除了要掌握 JAX-RS2 标准 还需要对统一接口、资源定位以及请求处理过程中 REST 风格的传输数据的格式、响应信息有良好的认知
REST 使用 HTTP 的 GET 方法获取服务器提供的资源 GET 方法是只读的
PUT 方法是一种写操作的 HTTP 请求
RPC 的所有写操作均使用 POST 方法 REST 只使用 HTTP 的 POST 方法添加资源
WebDAV(Web-based Distributed Authoring and Versioning,基于 Web 的分布式创作与版本控制) HTTP1,1 协议的一组扩展
REST 使用 URL 实现资源定位 对外提供 REST 式的 Web 服务接口就是公布一系列的 URL 及其参数
资源地址的设计对整个 REST 式的 Web 服务至关重要 涉及系统的可用性、可维护性和可扩展性 HTTP 方法和资源地址结合在一起才可以完成对资源的定位
GET /book?start=0&size=10
GET /books/01,2012-12,2014
GET /books/restful;program=java;type=web
POST /books ; PUT /books/{id}
DELETE /books/{id}
PUT /books/{id}
GET /book HTTP1.1
GET /books/{id} HTTP1.1 ; GET /books?id=12345678
GET /books?start=0&size=10 ; GET /books/01,2012-12,2013 ; GET /books/restful;program=java;type=web ; GET /books?limit=100&sort=bookname
方法代码 查询条件决定了方法的作用域,查询参数组成了查询条件 JAX-RS2 定义了 @QueryParam 注解来定义查询参数
/*http://localhost:9998/query-resource/sorted-yijings?limit=5&sort=pronounce*/
@Path("yijings")
@GET
@Produces({MediaType.APPLICATION_JSON , MediaType.APPLICATION_XML})
// @QueryParam 定义查询参数
public Yijings getByPaging (@QueryParam("start")final int start , @QueryParam("size")final int size) {
@DefaultValue("100") @QueryParam("size") final Integer pagesize
JAX-RS2 定义了 @PathParam 注解来定义路径参数 每个参数对应一个子资源
接口描述 | 资源地址 |
---|---|
基本参数路径 | /path-resource/Eric |
集合查询参数 | /path-resourc/Eric?hometown=Buenos Aires |
带有标点符号的资源路径 | /path-resource/199-1999 /path-resource/01,2012-12,2014 |
子资源变长的资源路径 | /path-resource/Asia/China/northeast/liaoning/shen yang/huangu /path- resource/q/restful;program=java;type=web /path-resource/q2/restful;program=java;type=web |
@GET
@Path("{user:[a-zA-Z][a-zA-Z_0-9]*}")
@Produces(MediaType.TEXT_PLAIN)
public String getUserInfo(@PathParam("user") final String user , @DefaultValue("China") @QueryParam("hometown")final String hometown) {
return user + ":" + hometown;
}
正则表达式 | 含义 |
---|---|
[a-zA-Z][a-zA-Z_0-9]* | 以字母开头,后面是零到多个“字母_数字”格式的字符组合 |
{region:.+}/{districe:\w+} | region 变量至少包含一个任意字符 district 变量至少包含一个为数字或者字母的字符 |
/*http://localhost:9998/path-resource/ZhongHao/China/southern/GuangDong/meizhou/pingyuan*/
/*http://localhost:9998/path-resource/China/southern/GuangDong/meizhou/pingyuan*/
/*http://localhost:9998/path-resource/southern/GuangDong/meizhou/pingyuan*/
@GET
@Path("{region:.+}/meizhou/{district:\\w+}")
@Produces(MediaType.TEXT_PLAIN)
public String getByAddress(@PathParam("region") final List<PathSegment> region , @PathParam("district") final String district) {
final StringBuilder result = new StringBuilder();
for(final PathSegment pathSegment : region) {
result.append(pathSegment.getPath()).append("-");
}
result.append("meizhou-").append(district);
final String r = result.toString();
PathResource.LOGGER.debug(r);
return r;
}
JAX-RS2 定义了 @FormParam 注解来定义表单参数 相应的 REST 方法用于处理实体媒体类型为 Content-Type:application/x-www-form-urlencoded 的请求
@Path("form-resource")
public class FormResource {
public static final String USER = "user";
public static final String PW = "password";
public static final String NPW = "newPassword";
public static final String VNPW = "verification";
@POST
public String newPassword(
@DefaultValue("ZhongHao") @FormParam(FormResource.USER) final String user
, @Encoded @FormParam(FormResource.PW) final String password
, @Encoded @FormParam(FormResource.NPW)final String newPassword
, @FormParam(FormResource.VNPW) final String verification) {
return user + ":" + password + ":" + newPassword + ":" + verification;
}
}
JAX-RS2 定义了 @BeanParam 注解用于自定义参数组合 使 REST 方法可以使用简洁的参数形式完成复杂的接口设计
// 参数组合
public class Jaxrs2GuideParam {
@HeaderParam("accept")
private String acceptParam;
@PathParam("region")
private String regionParam;
@PathParam("district")
private String districtParam;
@QueryParam("station")
private String stationParam;
@QueryParam("vehicle")
private String vehicleParam;
...
public class BeanParamResource {
@GET
@Path("{region:.+}/GuangDong/{district:\\w+}")
@Produces(MediaType.TEXT_PLAIN)
public String getByAddress(@BeanParam Jaxrs2GuideParam param) {
return param.getRegionParam() + ":" + param.getDistrictParam() +
":" + param.getStationParam() + ":" + param.getVehicleParam();
}
}
JAX-RS2 定义了 @CookieParam 注解用以匹配 Cookie 中的键值对信息
@GET
public String getHeaderParams(@CookieParam("longitude") final String longitude
,@CookieParam("latitude") final String latitude
,@CookieParam("population") final double population
,@CookieParam("area") final int area) {
return longitude + "," + latitude + " population=" + population + ",area=" + area;
}
JAX-RS2 定义了 @Context 注解来解析上下文参数 JAX-RS2 中有多种元素可以通过 @Context 注解作为上下文
public String getByAddress(@Context final Application application
, @Context final Request request
, @Context final Providers provider
, @Context final UriInfo uriInfo
, @Context final HttpHeaders headers) {
类名 | 含义 |
---|---|
Application | 应用上下文 |
Request | 请求上下文 |
Providers | 扩展类上下文 |
UriInfo | 路径信息上下文 |
HttpHeaders | 请求头信息上下文 |
REST 接口会以 XML 和 JSON 作为主要的传输格式
Jersey 支持传输 File 类型的数据,以方便客户端直接传递 File 类实例给服务器端
// 文件类型
// 默认使用的媒体类型是 Content-type:text/html
@POST
@Path("f")
public File postFile(final File f) throws FileNotFoundException, IOException {
try(BufferedReader br = new BufferedReader(new FileReader(f))) {
String s;
do {
s = br.readLine();
LOGGER.debug(s);
} while (s != null);
return f;
}
}
Jersey 支持 Java 的两大读写模式,即字节流和字符流
// 字节流类型
@POST
@Path("bio")
public String postStream(final InputStream in) throws IOException {
try(BufferedReader br = new BufferedReader(
// 需要设置编码
new InputStreamReader(in,"utf-8"))) {
StringBuilder result = new StringBuilder();
String s = br.readLine();
while(s != null) {
result.append(s).append("\n");
LOGGER.debug(s);
s = br.readLine();
}
return result.toString();
}
}
Index
by @zh826256645