上面一片博文讲述了rest概念、以及简单的rest接口的知识,相信大家也对此有了一些入门的理解。那么下面我就以一个具体的案例来实现一下,看看rest到底怎么用。
本文使用Jersey框架去实现restful程序,何为Jersey? Jersey是JAX-RS的具体实现,JAX-RS即Java API for RESTful Web Services,是一种应用程序接口,具体大家可以百度。好,下面开始Jersey!
首先来编写服务端程序:
//这里@Path定义了类的层次路径。 //指定了资源类提供服务的URI路径。 @Path("UserInfoService") public class UserInfo { // @GET表示方法会处理HTTP GET请求 @GET // 这里@Path定义了类的层次路径。指定了资源类提供服务的URI路径。 @Path("/name/{i}") // @Produces定义了资源类方法会生成的媒体类型。 @Produces(MediaType.TEXT_XML) // @PathParam向@Path定义的表达式注入URI参数值。 public String userName(@PathParam("i") String i) { String name = i; return "<User>" + "<Name>" + name + "</Name>" + "</User>"; }简单解释一下上面这个简单的服务端程序:
(1) @Path,是JAX-RS定义的一个注解,它代表资源的层次路径,也就是说我们稍后定义的URL资源中一定要包含这个注解中的路径的。
(2)@GET,是指下面的方法会处理HTTP GET请求。(关于标准HTTP方法,我下面会做详细解释)
(3)@Produces 标注返回的MIME媒体类型。
(4)@PathParam是解析得到@Path中传入的参数值。
再来看一下客户端程序:
public class UserInfoClient { public static final String BASE_URI = "http://localhost:8080/RESTfulWS"; public static final String PATH_NAME = "/UserInfoService/name/"; public static void main(String[] args) { String name = "mike"; int age = 25; ClientConfig config = new DefaultClientConfig(); Client client = Client.create(config); WebResource resource = client.resource(BASE_URI); WebResource nameResource = resource.path("rest").path(PATH_NAME + name); System.out.println("Response \n" + getResponse(nameResource) + "\n\n"); private static String getResponse(WebResource resource) { return resource.accept(MediaType.TEXT_XML).get(String.class); }我们在这个客户端程序中规定了如下URL:
http://localhost:8080/RESTfulWS/rest/UserInfoService/name/mike
其中RESTfulWS是工程名,rest是web.xml文件中规定的url-pattern访问格式,至于UserInfoService/name/,就是我们的服务端程序中@Path注解里规定的资源层次路径,mike是参数,由@PathParam解析出来,并传递给方法。
这个例子只是很简单的说明了基于Jersey的rest使用,其实对于它的更多知识,可以参考一本书《Java RESTful Web Service实战 》。
着重讲下标准HTTP方法
http方法有很多,但我们常用就那么几个,get/post/put/delete 每一种http请求方法我们都可以从安全性与幂等性这两个方面来考虑。安全性代表安全的rest接口,是指外部系统对该接口的访问,不会改变服务器端资源状态的改变;而幂等性则是指外部系统对同一rest接口的多次访问,得到的资源状态是相同的。
1、GET方法
GET方法用于读取资源,它具有幂等性与安全性。但是设计不良的API会违背GET的特性。
2、PUT方法
PUT方法是一种写操作的http请求,rest使用http的PUT方法用来更新会添加资源,幂等但不安全。
3、POST方法
POST方法是一种写操作的http请求,RPC的所有写操作均使用POST方法,而REST只使用POST方法添加资源,不幂等且不安全。
4、DELETE方法
DELETE方法是幂等的,即多次删除同一份数据,在服务端产生的改变是相同的。
关于HTTP的这4种标准方法,还有很多知识需要学习,有时间再来更新。
另外,鉴于在项目中并没有使用Jersey框架实现rest,而是用到了Spring-MVC,这个框架本身对rest提供了良好的支持,所以会在稍后的博文中讲解一下基于spring-MVC的rest使用、、、