一.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>
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 }
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 }
這里需要介紹一下 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的訪問要簡單的多。
