關於 Java API for RESTful Web Services (JAX-RS) 介紹及案例


一.webService介紹

  之前的文章我介紹了cxf webService的使用,它是一種以wsdl發布的形式。下面結合我在了解說明下兩組概念:

  jax-ws  全稱:JavaTM API forXML-Based Web Services ,實現基於soap協議的Web Service提供的API,SOAP:簡單對象訪問協議,它是交換數據的一種協議規范,是一種輕量的、簡單的、基於XML標准通用標記語言下的一個子集)的協議,

  它被設計成在WEB上交換結構化的和固化的信息。

  jax-rs 全稱: JavaTM API for RESTful Web Services, 基於REST設計風格的WebServcice提供的API。它是一個Java 編程語言的應用程序接口,支持按照表述性狀態轉移(REST)架構風格創建Web服務。

二.jax-ws 和 jax-rs 的應用場景

   jax-ws 是一套標准的soap協議,他是跨語言平台的,可移植性較高,目前在webService服務中是主流,通過服務端發布wsdl格式的xml文件,供客戶端訪問。

   jax-rs 是一套java 編程的應用程序風格,那他就不具備誇平台性,移植性單一。但是目前主流的訪問都趨向於rest風格,和springMVC無縫銜接,同時它為dubbo提供了接近透明的REST調用支持。

三.搭建 jax-rs web服務

  這個案例是基於我前兩篇jax-ws的基礎上寫的,沒有我之前的webService案例的小伙伴,戳這里閱讀

    http://www.cnblogs.com/sumingk/articles/6069220.html

    http://www.cnblogs.com/sumingk/articles/6069490.html  

  1.這是jax-rs xml文件配置,與ws的發布風格很類似,calss指定Service的地址,address為發布的范圍地址,

 1 <?xml version="1.0" encoding="UTF-8"?>  
 2 <beans  
 3     xmlns="http://www.springframework.org/schema/beans"  
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
 5     xmlns:p="http://www.springframework.org/schema/p"  
 6     xmlns:tx="http://www.springframework.org/schema/tx"  
 7     xmlns:aop="http://www.springframework.org/schema/aop"  
 8     xmlns:jaxws="http://cxf.apache.org/jaxws"    
 9     xmlns:jaxrs="http://cxf.apache.org/jaxrs"    
10     xsi:schemaLocation="http://www.springframework.org/schema/beans   
11                         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
12                         http://www.springframework.org/schema/tx  
13                         http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
14                         http://www.springframework.org/schema/aop  
15                         http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
16                         http://cxf.apache.org/jaxws    
17                         http://cxf.apache.org/schemas/jaxws.xsd    
18                         http://cxf.apache.org/jaxrs    
19                         http://cxf.apache.org/schemas/jaxrs.xsd">  
20     
21     <bean id="userImpl" class="com.hdjf.app.me.impl.UserServiceImpl" />
22     <jaxrs:server id="userServer" address="/userCxf">
23         <jaxrs:serviceBeans>
24             <ref bean="userImpl"/>
25         </jaxrs:serviceBeans>
26     </jaxrs:server>
27     
28 
29 </beans>
View Code

  2.接口的定義

 1 package com.hdjf.app.me;
 2 
 3 import javax.jws.WebService;
 4 import javax.ws.rs.core.UriInfo;
 5 
 6 /**
 7  * 用戶接口
 8  * 
 9  * @author zhj
10  */
11 @WebService
12 public interface IUserService {
13 
14     /**
15      * 登錄
16      * 
17      * @param phone
18      *            電話號
19      * @param password
20      *            密碼 {"phone":"18619487261","password":"123"}
21      * @return
22      */
23     public String actionlogin(String type, String oper, String source,
24             String version, String url, String secret, String sign,
25             String para, String device,UriInfo ui);
26 
27     /**
28      * 注冊
29      * 
30      * @param phone
31      *            電話號
32      * @param emscode
33      *            手機驗證碼
34      * @param password
35      *            密碼 {"phone":"18619487261","emscode":"123","password":"123"}
36      * @return
37      */
38     public String regist(String type, String oper, String source,
39             String version, String url, String secret, String sign,
40             String para, String device,UriInfo ui);
41 
42     /**
43      * 獲取動態密碼
44      * 
45      * @return
46      */
47     public String getDynamicNum(String phone);
48 
49 }
View Code

 3.service實現類

  1 package com.hdjf.app.me.impl;
  2 
  3 import java.util.UUID;
  4 
  5 import javax.annotation.Resource;
  6 import javax.ws.rs.Consumes;
  7 import javax.ws.rs.FormParam;
  8 import javax.ws.rs.POST;
  9 import javax.ws.rs.Path;
 10 import javax.ws.rs.Produces;
 11 import javax.ws.rs.core.Context;
 12 import javax.ws.rs.core.MediaType;
 13 import javax.ws.rs.core.Response;
 14 import javax.ws.rs.core.Response.ResponseBuilder;
 15 import javax.ws.rs.core.Response.Status;
 16 import javax.ws.rs.core.UriInfo;
 17 
 18 import net.sf.json.JSONObject;
 19 
 20 import com.hdjf.app.me.IUserService;
 21 import com.hdjf.comm.VO;
 22 import com.hdjf.comm.VOList;
 23 import com.hdjf.dao.BaseDAO;
 24 
 25 @Path("/UserInfo")
 26 @Produces({ "application/json", "application/xml" })
 27 public class UserServiceImpl implements IUserService {
 28     
 29     @Resource
 30     public BaseDAO jdbcDAO;
 31     
 32     public static void main(String[] args) {
 33         // 創建 GUID 對象
 34         UUID uuid = UUID.randomUUID();
 35         // 得到對象產生的ID
 36         String token = uuid.toString().toUpperCase();
 37         // 替換 “-”變成空格
 38         token = token.replaceAll("-", "");
 39         System.out.println(token);
 40         
 41         String json = "{'type': 'truck','oper': 'actionlogin','source': '',"
 42                 + "'version': '','url': '',"
 43                 + "'para': {'phone': '18310665040','password': '123'},"
 44                 + "'device': {'os': 'ios','imei': '5284cc188ecb8d8118774e534eaa74a6d8437344','osv': '6.0'},"
 45                 + "'secret': '','sign': ''}";
 46         JSONObject obj = JSONObject.fromObject(json);
 47         System.out.println(JSONObject.fromObject(obj.get("para")).get("phone") +"===="+obj.getString("type"));
 48         
 49     }
 50     
 51     public static String printToken(){
 52         // 創建 GUID 對象
 53         UUID uuid = UUID.randomUUID();
 54         // 得到對象產生的ID
 55         String token = uuid.toString().toUpperCase();
 56         // 替換 “-”變成空格
 57         token = token.replaceAll("-", "");
 58         
 59         return token;
 60     }
 61     
 62     
 63     @POST
 64     @Path("/actionlogin")
 65     @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
 66     @Produces(MediaType.APPLICATION_JSON)
 67     public String actionlogin(
 68             @FormParam("type") String type,
 69             @FormParam("oper") String oper,
 70             @FormParam("source") String source,
 71             @FormParam("version") String version,
 72             @FormParam("url") String url,
 73             @FormParam("secret") String secret,
 74             @FormParam("sign") String sign,
 75             @FormParam("para") String para,
 76             @FormParam("device") String device, @Context UriInfo ui) {
 77         
 78         JSONObject paraObj = JSONObject.fromObject(para);
 79         String phone = paraObj.getString("phone");
 80         String password = paraObj.getString("password");
 81         JSONObject obj = new JSONObject();
 82         
 83         obj.put("type", type);
 84         obj.put("oper", oper);
 85         obj.put("source", source);
 86         obj.put("version", version);
 87         obj.put("secret", secret);
 88         obj.put("sign", sign);
 89         String sql = "select user_id,user_name from t_user where user_phone='"+phone+"' and user_pass='"+password+"' ";
 90         System.out.println(sql);
 91         VOList vlist = jdbcDAO.queryByVOList(sql);
 92         
 93         String msg ="登錄成功!";
 94         obj.remove("para");
 95         obj.remove("device");
 96         JSONObject dataObj = new JSONObject();
 97         if(vlist.size()==0){
 98             msg = "用戶名或密碼錯誤!";
 99             dataObj.put("uid", "");
100         }else{
101             dataObj.put("uid", vlist.get(0).getAttr("user_id"));
102         }
103         dataObj.put("token", printToken());
104         obj.accumulate("data", dataObj);
105         
106         ResponseBuilder rb=Response.created(ui.getRequestUri());
107         int code = rb.status(Status.OK).build().getStatus();
108         
109         obj.put("code", code);
110         obj.put("msg", msg);
111         System.out.println(obj.toString());
112         return obj.toString();
113     }
114     
115     
116     @POST
117     @Path("/regist")
118     @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
119     @Produces(MediaType.APPLICATION_JSON)
120     public String regist(@FormParam("type") String type,
121             @FormParam("oper") String oper,
122             @FormParam("source") String source,
123             @FormParam("version") String version,
124             @FormParam("url") String url,
125             @FormParam("secret") String secret,
126             @FormParam("sign") String sign,
127             @FormParam("para") String para,
128             @FormParam("device") String device, @Context UriInfo ui) {
129         
130         JSONObject paraObj = JSONObject.fromObject(para);
131         String phone = paraObj.getString("phone");
132         String password = paraObj.getString("password");
133         
134         JSONObject obj = new JSONObject();
135         obj.put("type", type);
136         obj.put("oper", oper);
137         obj.put("source", source);
138         obj.put("version", version);
139         obj.put("secret", secret);
140         obj.put("sign", sign);
141         
142         /**
143          * user_type : 1:個人用戶,2:企業用戶',
144          * isAuthen : 0:false,1:true
145          * user_authentype,1.已注冊用戶,2.已實名認證,3.已綁定銀行卡'
146          * isGestureLogin, 0:false,1:true
147          */
148         String sql = "select REPLACE(uuid(),'-','') as uuid";
149         VO v = this.jdbcDAO.queryByVO(sql);
150         String uuid = v.getAttr("uuid");
151         
152         String insertsql = "insert into t_user (user_id,user_pass,user_phone,user_type,isAuthen,user_authentype,createtime) "
153                 + " values ('"+uuid+"','"+password+"','"+phone+"',1,0,1,date_format(now(),'%Y-%m-%d %T'))";
154     
155         JSONObject dataObj = new JSONObject();
156         dataObj.put("token", printToken());
157         dataObj.put("uid", uuid);
158         
159         String msg = "注冊成功!";
160         obj.put("msg", msg);
161         
162         ResponseBuilder rb=Response.created(ui.getRequestUri());
163         int code = rb.status(Status.OK).build().getStatus();
164         obj.put("code", code);
165         try {
166             jdbcDAO.execute(insertsql);
167         } catch (Exception e) {
168             msg = "用戶注冊異常"+e.getMessage();
169             obj.put("msg", msg);
170             dataObj.put("uid", "");
171             obj.put("code", rb.status(Status.INTERNAL_SERVER_ERROR).build().getStatus());
172         }
173         
174         obj.accumulate("data", dataObj);
175         
176         return obj.toString();
177     }
178 
179     @Override
180     public String getDynamicNum(String phone) {
181         // TODO Auto-generated method stub
182         return null;
183     }
184 
185 
186 }
View Code

 這里需要介紹一下 service實現類上的注解

@Path("/UserInfo") //當前類的范圍路徑
@Produces({ "application/json", "application/xml" }) //指定當前類返回的數據格式

同樣的方法上也有@path注解是當前方法的路徑名稱,類似於springMVC,@Consumes(MediaType.APPLICATION_FORM_URLENCODED) 定義接受類型,@Produces(MediaType.APPLICATION_JSON) 定義當前方法的返回類型,它的優先級高於類上注解的定義

 4.以上的代碼是我在工作業務上的應用,小伙伴可以采用簡單的定義參數定義,其他的業務工具類我就不貼代碼了,有需要的小伙伴可以在留言區@我。

 5.最后看下發布jax-rs服務,他的后綴名有別於wsdl,而是_wadl

6.最后客戶端的請求訪問,就用普通的http請求就可以,相對來說比soap的訪問要簡單的多。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM