本文中demo是利用Jersey框架创建RESTful Web Service, Jersey RESTful 框架是开源的RESTful框架, 实现了JAX-RS (JSR 311 & JSR 339) 规范。它扩展了JAX-RS 参考实现, 提供了更多的特性和工具, 可以进一步地简化 RESTful service 和 client 开发(Jersey百度百科)
1.借助Maven新建Java Web项目名称为restful-demo,pom中引入以下依赖包
<!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-client -->
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-core -->
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.19.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-core -->
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.19.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-core -->
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-servlet</artifactId>
<version>1.19.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.sun.jersey/jersey-json -->
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.19.4</version>
</dependency>
2.新建User实体类
package com.demo.restful.model;
/**
* @Author:
* @Date: 2019/1/8 10:37
*/
public class User {
private String name;
private Integer age;
public User() {
}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
3.编写restful接口
package com.demo.restful.service.impl;
import com.demo.restful.model.User;
import com.demo.restful.service.UserService;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
/**
* @Author:
* @Date: 2019/1/8 11:37
*/
//这里@Path指定提供服务的类级别的URI路径
@Path("user")
public class UserServiceImpl implements UserService {
@Override
/**
* GET:读取(Read)
* POST:新建(Create)
* PUT:更新(Update)
* PATCH:更新(Update),通常是部分更新
* DELETE:删除(Delete)
**/
//这里@GET表示此方法只处理HTTP GET请求
@GET
//这里@Path指定提供服务的方法级别的URI路径
//其中{name},{age}分别对应@PathParam("name")和@PathParam("age")
@Path("getUser/{name}/{age}")
//指定此方法返回的媒体类型,即返回值的形式
@Produces(MediaType.APPLICATION_JSON)
//@PathParam("name"),@PathParam("age")向@Path中定义的表达式注入参数值
public String getUser(@PathParam("name") String name,@PathParam("age") Integer age) {
return new User(name,age).toString();
}
}
4.通过web.xml配置Jersey拦截器
5.启动项目,通过浏览器访问http://localhost:8080/rest/user/getUser/xiaoming/18
6.将此restful-demo保持运行状态,模拟服务端;新建restful-client项目(pom同restful-demo一致),模拟客户端,在客户端项目中创建测试类,模拟发送请求
package com.demo.restful;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import javax.ws.rs.core.MediaType;
/**
* @Author:
* @Date: 2019/1/8 14:22
*/
public class UserCient {
public static void main(String[] args) {
ClientConfig clientConfig = new DefaultClientConfig();
Client client = Client.create(clientConfig);
//等同于WebResource resource =
//client.resource("http://localhost:8080/rest/user/getUser/xiaoming/18");
WebResource resource =
client.resource("http://localhost:8080/rest/user/getUser").path("/xiaoming/18");
//设置以JSON形式返回
WebResource.Builder accept = resource.accept(MediaType.APPLICATION_JSON_TYPE);
//发送GET请求获取ClientResponse
ClientResponse clientResponse = accept.get(ClientResponse.class);
//输出此次请求的ClientResponse
System.out.println(clientResponse);
//发送GET请求获取调用接口的返回值
String valueResponse = accept.get(String.class);
//输出此次请求资源的返回值
System.out.println(valueResponse);
}
}
调用结果
7.我们也可以通过火狐的rest client直接访问
RESTful(Representational State Transfer,即表现层状态转化)是目前最流行的 API 设计规范,用于 Web 数据接口的设计,它仅仅是一种软件 架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件
产生背景:近年来移动互联网的发展,前端设备层出不穷(手机、平板、桌面电脑、其他专用设备......),因此,必须有一种统一的机制,方便 不同的前端设备与后端进行通信,于是 RESTful 诞生了,它可以通过一套统一的接口为 Web,iOS 和 Android 提供服务。
特点:基于“资源”,服务器上数据,服务都是资源,比如一个文件,一张图片都有对应的 url 地址,如果我们的客户端需要对服务器上的这个 资源进行操作,就需要通过 http 协议执行相应的动作(增删改查)来操作它,GET:查询,POST:新增,PUT:更新,DELETE:删除。