基于jersey实现restful程序设计(二)

时间:2021-08-03 19:33:30

上面一片博文讲述了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使用、、、