苏铭客

导航

关于 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的访问要简单的多。

 

posted on 2017-07-27 11:29  苏铭客  阅读(5320)  评论(0编辑  收藏  举报