智能手機(jī)使用JSON與服務(wù)端交互架構(gòu)思考與實(shí)現(xiàn)_第1頁(yè)
智能手機(jī)使用JSON與服務(wù)端交互架構(gòu)思考與實(shí)現(xiàn)_第2頁(yè)
智能手機(jī)使用JSON與服務(wù)端交互架構(gòu)思考與實(shí)現(xiàn)_第3頁(yè)
智能手機(jī)使用JSON與服務(wù)端交互架構(gòu)思考與實(shí)現(xiàn)_第4頁(yè)
智能手機(jī)使用JSON與服務(wù)端交互架構(gòu)思考與實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、智能手機(jī)使用JSON與服務(wù)端交互架構(gòu)思考與實(shí)現(xiàn)關(guān)于喧囂求靜網(wǎng)名:喧囂求靜 個(gè)人博客:www.apk-QQ:879081656說(shuō)明:喧囂之中求一點(diǎn)寧?kù)o,淡泊明志、寧?kù)o致遠(yuǎn)頭像就不貼啦,寫文章有點(diǎn)不好意思,怕寫得不好,到時(shí)沒(méi)臉見(jiàn)各位,哈哈申明:文章引用過(guò)網(wǎng)友的圖片、博客,在此感謝,若有侵權(quán)請(qǐng)聯(lián)系背景在開發(fā)手機(jī)客戶端APP時(shí),經(jīng)常會(huì)與服務(wù)端交換數(shù)據(jù)。數(shù)據(jù)交換接口通常會(huì)以XML格式和JSON兩種常用格式返回?cái)?shù)據(jù),在傳統(tǒng)web頁(yè)面開發(fā)中,隨著AJAX技術(shù)的興起,JSON作為一種輕量級(jí)的數(shù)據(jù)交換格式,以其易于閱讀和編寫的優(yōu)點(diǎn),被應(yīng)用到越來(lái)越多的項(xiàng)目中,轉(zhuǎn)到手機(jī)客戶端開發(fā),這就自然而然的優(yōu)先選擇JSON作為

2、與服務(wù)端的數(shù)據(jù)交換。筆者在一線開發(fā)多年,接觸到手機(jī)客戶端和服務(wù)端開發(fā),比較常用的數(shù)據(jù)交換格式即xml和json。Xml:應(yīng)用場(chǎng)景是為了兼容舊有系統(tǒng)和跨異構(gòu)網(wǎng)絡(luò),降低接口開發(fā)成本,例如:接口是webservice服務(wù)接口Json:應(yīng)用場(chǎng)景基本上是基于http協(xié)議開發(fā)接口,屬于全新開發(fā),接口開發(fā)成本稍微高。為什么實(shí)際項(xiàng)目開發(fā)中,優(yōu)先選擇使用基于http協(xié)議開發(fā)接口返回json數(shù)據(jù)格式呢?1. 手機(jī)端流量考慮,jsono數(shù)據(jù)格式相對(duì)xml節(jié)約流量,流量對(duì)于手機(jī)可是要用米的啊2. 手機(jī)端處理性能考慮,基于http協(xié)議返回json數(shù)據(jù),便于數(shù)據(jù)處理,速度快服務(wù)端架構(gòu)思考場(chǎng)景一手機(jī)端和服務(wù)端接口業(yè)務(wù)描述:

3、手機(jī)端用戶發(fā)起http請(qǐng)求-web服務(wù)器接收請(qǐng)求-調(diào)用接口-返回處理后的json數(shù)據(jù) -手機(jī)端接收數(shù)據(jù)解析-判斷數(shù)據(jù)的正確性-處理數(shù)據(jù)展現(xiàn)返回的json數(shù)據(jù)“key”:”value”,對(duì)于場(chǎng)景一,簡(jiǎn)單實(shí)現(xiàn)了需求上的要求,但沒(méi)有考慮到數(shù)據(jù)傳輸上的安全性問(wèn)題及服務(wù)端處理時(shí),有錯(cuò)誤或異常的情況,所以筆都設(shè)想出第二種場(chǎng)景場(chǎng)景二手機(jī)端和服務(wù)端接口業(yè)務(wù)描述:手機(jī)端用戶發(fā)起https請(qǐng)求-web服務(wù)器接收請(qǐng)求-調(diào)用接口-返回處理后的json數(shù)據(jù) -手機(jī)端接收數(shù)據(jù)解析-判斷數(shù)據(jù)的正確性-處理數(shù)據(jù)展現(xiàn)返回的json數(shù)據(jù)“flag”:true,”msg”:”接口成功”,“data”:“key”:”value”,說(shuō)

4、明:flag標(biāo)識(shí)處理成功為true,否則為false,msg為處理消息說(shuō)明,若flag=false,則為友好的錯(cuò)誤信息data為數(shù)據(jù)部分,若flag=false,則為空json串服務(wù)端架構(gòu)實(shí)現(xiàn)筆者選擇的相關(guān)技術(shù)如下:Web 服務(wù)器:tomcat框架:spring mvc 配置tomcat 服務(wù)器支持httpsSSL協(xié)議使用不對(duì)稱加密技術(shù)實(shí)現(xiàn)雙方之間信息的安全傳遞??梢詫?shí)現(xiàn)信息傳遞的保密性、完整性,并且會(huì)話雙方能鑒別對(duì)方身份。 與網(wǎng)站建立https連接時(shí),瀏覽器與WEB SERVER之間要經(jīng)過(guò)一個(gè)握手的過(guò)程來(lái)完成身份鑒定與密鑰交換,建立安全連接。過(guò)程是: 1、用戶瀏覽器將其S

5、SL版本號(hào)、加密設(shè)置參數(shù)、與session有關(guān)的數(shù)據(jù)以及其它一些必要信息發(fā)送到服務(wù)器 2、服務(wù)器將其SSL版本號(hào)、加密設(shè)置參數(shù)、與session有關(guān)的數(shù)據(jù)以及其它必要信息發(fā)送給瀏覽器,同時(shí)發(fā)給瀏覽器的還有服務(wù)器的證書。如果配置服務(wù)器的SSL需要驗(yàn)證用戶身份,還要發(fā)出請(qǐng)求瀏覽器提供用戶證書。 3、客戶端檢查服務(wù)器證書,如果檢查失敗,提示不能建立SSL連接,如果成功,則繼續(xù) 4、客戶端瀏覽器為本次會(huì)話生成pre-master secret,并將其用服務(wù)器公鑰加密后發(fā)送給服務(wù)器。5、如果服務(wù)器要求鑒別客戶身份,客戶端還要再對(duì)另外一些數(shù)據(jù)簽名后并將其與客戶端證書一起發(fā)送給

6、服務(wù)器。6、如果服務(wù)器要求鑒別客戶身份,則檢查簽署客戶證書的CA是否可信。如果不在信任列表中,結(jié)束本次會(huì)話。如果檢查通過(guò),服務(wù)器用自己的私鑰解密收到的 pre-master secret,并用它通過(guò)某些算法生成本次會(huì)話的master secret。 7、客戶端與服務(wù)器均使用此master secret生成本次會(huì)話的會(huì)話密鑰(對(duì)稱密鑰)。在雙方SSL握手結(jié)束后傳遞任何消息均使用此會(huì)話密鑰。這樣做的主要原因是對(duì)稱加密比非對(duì)稱加密的運(yùn)算量低一個(gè)數(shù)量級(jí)以上,能夠顯著提高雙方會(huì)話時(shí)的運(yùn)算速度。 8、客戶端通知服務(wù)器此后發(fā)送的消息都使用這個(gè)會(huì)話密鑰進(jìn)行加密。并通知服務(wù)器客戶端已經(jīng)完成本

7、次SSL握手。 9、服務(wù)器通知客戶端此后發(fā)送的消息都使用這個(gè)會(huì)話密鑰進(jìn)行加密。并通知客戶端服務(wù)器已經(jīng)完成本次SSL握手。 10、本次握手過(guò)程結(jié)束,會(huì)話已經(jīng)建立。雙方使用同一個(gè)會(huì)話密鑰分別對(duì)發(fā)送以及接受的信息進(jìn)行加、解密。 一、創(chuàng)建證書C:UsersAdministrator>keytool -genkey -alias tomcat -keyalg RSA -keystore e:tomcat.keystore輸入密鑰庫(kù)口令:tomcat二、配置tomcat,使其支持https連接打開tomcat目錄下conf/server.xml文件,將之前的連接部分注釋

8、,找到以下節(jié)點(diǎn):<!- Define a SSL HTTP/1.1 Connector on port 8443         This connector uses the JSSE configuration, when using APR, the          connector should be using the OpenSSL style configuration   

9、;      described in the APR documentation -><!    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"               maxThreads="150"

10、 scheme="https" secure="true"               clientAuth="false" sslProtocol="TLS" />    ->將<connectore節(jié)點(diǎn)的注釋去掉,8443修改為你要使用的端口。節(jié)點(diǎn)中添加兩個(gè)屬性:keystoreFile="C:/tomcat.key

11、store" keystorePass="123456"其中,keystoreFile指的是你第一步生成的證書文件位置,keystorePass是你在生成證書時(shí)所輸入的密碼。搭建spring mvc環(huán)境第一步:搭建spring mvc環(huán)境:工程依賴jarweb.xml配置文件<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servle

12、t-class><load-on-startup>1</load-on-startup><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping>  <context-param><param-name>contextConfigLocation</param-name><param-value&g

13、t;/WEB-INF/dispatcher-servlet.xml</param-value></context-param> <listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-

14、file-list>spring mvc配置文件dispatcher-servlet.xml<beans xmlns="/schema/beans"xmlns:context="/schema/context"xmlns:xsi="/2001/XMLSchema-instance" xmlns:mvc="/sc

15、hema/mvc"xsi:schemaLocation="/schema/beans  /schema/beans/spring-beans-3.0.xsd   /schema/mvc/schema/mvc/spring-mvc-3.2.xsd   http:/www.springframewor

16、/schema/context /schema/context/spring-context-3.0.xsd">  <context:component-scan base-package="net.study"/> <beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="pref

17、ix"><value>/WEB-INF/views/</value></property><property name="suffix"><value>.jsp</value></property></bean> <beanclass="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  <prop

18、erty name="messageConverters"><list><ref bean="stringHttpMessageConverter" /><ref bean="mappingJacksonHttpMessageConverter" /></list></property> </bean><bean id="stringHttpMessageConverter"class="org.springfr

19、amework.http.converter.StringHttpMessageConverter"><property name="supportedMediaTypes"><list><value>text/plain;charset=UTF-8</value><value>text/html;charset=UTF-8</value></list></property> </bean> <bean id="ma

20、ppingJacksonHttpMessageConverter"class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> <property name="supportedMediaTypes"><list><value>application/json;charset=UTF-8</value><value>text/html;charset=UTF-8&l

21、t;/value></list></property></bean><mvc:annotation-drivencontent-negotiation-manager="contentNegotiationManager" /><bean id="contentNegotiationManager"class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"><propert

22、y name="favorPathExtension" value="false" /><property name="favorParameter" value="false" /><property name="ignoreAcceptHeader" value="false" /><property name="mediaTypes"><value>atom=application/atom+xm

23、lhtml=text/htmljson=application/json*=*/* </value></property></bean></beans>測(cè)試訪問(wèn),默認(rèn)導(dǎo)向index.jsp,工程搭建成功JSON數(shù)據(jù)包裝類實(shí)現(xiàn)返回的json數(shù)據(jù)“flag”:true,”msg”:”接口成功”,“data”:“key”:”value”,public class ResultJsonWrap implements Serializable private static final long serialVersionUID = -90543709208

24、69476388L; /* 是否成功: */ private boolean flag = true; /* 調(diào)用接口返回的消息 */ private String msg = "調(diào)用成功" /* 返回的數(shù)據(jù)對(duì)象 */ private Object data = "" /*分頁(yè)查詢時(shí),同一查詢下的總記錄數(shù)*/ private int rowCount=0; /*分頁(yè)查詢時(shí),同一查詢下的總頁(yè)數(shù)*/private int totalPage=0;因?yàn)榭紤]到手機(jī)客戶端經(jīng)常會(huì)用到列表展示數(shù)據(jù),并要求支持分面,在此設(shè)計(jì)一個(gè)分頁(yè)的DTOpublic class Ap

25、pPageDto<T> implements Serializable /*分頁(yè)查詢時(shí),同一查詢下的總記錄數(shù)*/ private int rowCount=0; /*分頁(yè)查詢時(shí),同一查詢下的總頁(yè)數(shù)*/ private int totalPage=0; /*查詢結(jié)果*/ private List<T> resultList;異常處理定義 public class AppExcetion extends Exception /* * */private static final long serialVersionUID = -8384800471314873635L;pr

26、ivate int errorCode;private String errorMsg;接口實(shí)現(xiàn)包結(jié)構(gòu)定義 Com.study -Controller 對(duì)應(yīng)mvc中控制器 -Service 服務(wù)層-Dao 數(shù)據(jù)持久層 -dto 數(shù)據(jù)傳輸對(duì)象中 -exception 自定義異常Controller: 注解,表示此類為spring mvc中控制器類RequestMapping(value = "/study/*") 注解,表示此類訪問(wèn)path限定在studyRequestMapping(value = "/appLogin.action") 表示具體的訪問(wèn)接

27、口,/study/ appLogin.actionResponseBody 表示此接口返回?cái)?shù)據(jù)格式為json舉個(gè)常用的登錄校驗(yàn)案例ControllerRequestMapping(value = "/study/*")public class LogionController Autowired Qualifier("userServiceP") private IUserService userService;/* * App登錄接口* return result */RequestMapping(value = "/appLogin.action")ResponseBodypublic ResultJ

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論