BlackBerry開(kāi)發(fā)中應(yīng)用程序之MDS服務(wù)參考
本文和大家重點(diǎn)學(xué)習(xí)一下BlackBerry開(kāi)發(fā)中應(yīng)用程序之MDS服務(wù)參考,主要包括HTTP請(qǐng)求,HTTP請(qǐng)求變量和HTTP響應(yīng)等內(nèi)容,希望本文的介紹能讓你有所收獲。
BlackBerry開(kāi)發(fā)中應(yīng)用程序之MDS服務(wù)參考
HTTP請(qǐng)求[1]
一個(gè)客戶端建立一個(gè)連接,并且發(fā)送一個(gè)HTTP請(qǐng)求消息到服務(wù)器.服務(wù)器然后發(fā)送一個(gè)響應(yīng)消息,這個(gè)消息通常包含了請(qǐng)求的資源.
- <method><resource_path><version>
- Header1:value1
- Header2:value2
- Header3:value3
- <optionalmessage>
HTTP請(qǐng)求變量
描述
method
方法名,指定了一個(gè)動(dòng)作,例如GET,HEAD或POST.常用的方法是GET,它從服務(wù)器請(qǐng)求一個(gè)資源.
resource_path
指向請(qǐng)求資源的路徑,它是URL中的一部分,在主機(jī)名后面出現(xiàn).它也稱(chēng)為請(qǐng)求URL(RequestURL).
version
你正在運(yùn)行的HTTP版本,標(biāo)記為”HTTP/x.x”.BES支持1.0和1.1版本.
Header
提供了關(guān)于請(qǐng)求的或在消息體里發(fā)送的對(duì)象的信息.
optionalmessage
HTTP消息可以包含數(shù)據(jù).在一個(gè)請(qǐng)求里,它是發(fā)送到服務(wù)器的用戶類(lèi)型的數(shù)據(jù),或上傳的文件.當(dāng)一個(gè)對(duì)象伴隨著此消息時(shí),請(qǐng)求通常也包含定義它屬性的消息頭.
HTTP響應(yīng)
在HTTP請(qǐng)求消息的接收之上,服務(wù)器發(fā)送一個(gè)響應(yīng)消息,它通常包含了請(qǐng)求的資源.
- <HTTPversion><status_code><reason>
- Header1:value1
- Header2:value2
- Header3:value3
- <message>
HTTP響應(yīng)變量
描述
HTTP_version
正在運(yùn)行的HTTP版本,標(biāo)記為”HTTP/x.x”.BES支持1.0和1.1版本.
status_code
狀態(tài)碼的數(shù)值,它反映了客戶端提出的請(qǐng)求的結(jié)果。例如,200(OK)說(shuō)明了傳輸成功,404(NotFound)說(shuō)明了請(qǐng)求的URL沒(méi)有找到。
reason
reason是和狀態(tài)碼相關(guān)的文本消息。
Header
消息頭提供了響應(yīng)的信息,也提供了消息體中正在發(fā)送的對(duì)象的信息。
message
HTTP消息必須包含數(shù)據(jù)。在一個(gè)響應(yīng)消息里,它提供了客戶端請(qǐng)求的的內(nèi)容。此響應(yīng)也包含了定義它的屬性的消息頭。
注:應(yīng)用程序應(yīng)該檢查HTTP響應(yīng)消息的狀態(tài)碼。任何不是200(OK)的狀態(tài)碼都說(shuō)明當(dāng)建立HTTP連接時(shí)發(fā)生了一個(gè)錯(cuò)誤。#p#
Push請(qǐng)求響應(yīng)狀態(tài)碼
為push請(qǐng)求連接服務(wù),BlackBerryMDS返回2種響應(yīng)碼:
lPAP(PushAccessProtocal)響應(yīng)碼。
lRIMPush響應(yīng)碼。
注:訪問(wèn)[url]www.wapforum.org[/url]獲得更多關(guān)于PAP響應(yīng)碼的信息。
RIMPush請(qǐng)求響應(yīng)碼
RIMPush請(qǐng)求響應(yīng)碼
描述
解釋
200
OK
請(qǐng)求成功完成。
400
任何其他的錯(cuò)誤。
403
訪問(wèn)控制錯(cuò)誤,或者未知的郵件地址或特定的BlackBerryPIN。
服務(wù)器接收了請(qǐng)求,但是不能響應(yīng)。
503
服務(wù)器忙,服務(wù)不可用。
當(dāng)前,服務(wù)器不能管理請(qǐng)求,因?yàn)闀簳r(shí)的負(fù)載或服務(wù)器正在維護(hù)。
HTTPS支持
如果你的應(yīng)用程序通過(guò)Internet訪問(wèn)服務(wù)器,為了提過(guò)其他的驗(yàn)證和安全,在TLS上建立一個(gè)安全的HTTP(HTTPS)連接。
HTTPS認(rèn)證(Certificate)管理
當(dāng)BlackBerry設(shè)備以代理模式請(qǐng)求一個(gè)HTTPS連接時(shí),BlackBerryMDS服務(wù)為BlackBerry設(shè)備建立一個(gè)SSL連接。系統(tǒng)管理員配置MDS服務(wù),要么允許連接到未信任的服務(wù)器,要么是限制訪問(wèn)信任的服務(wù)器,這個(gè)配置僅適用代理模式下的連接。在end-to-end模式里,BlackBerry設(shè)備建立一個(gè)SSL連接。
在BlackBerry管理器里,系統(tǒng)管理員編輯MDS服務(wù)屬性,并且設(shè)置TLS和HTTP選項(xiàng),為獲得更多信息,參看BES管理指南。
注:在MDS服務(wù)模擬器里,通過(guò)設(shè)置rimpublic.property文件來(lái)允許或拒絕訪問(wèn)未信任的服務(wù)器。設(shè)置application.handler.https.allowUntrustedServer參數(shù)為true或false。參看177頁(yè)的“配置BlackBerryMDS模擬器”獲得更多信息。
如果MDS服務(wù)包含認(rèn)證,MDS服務(wù)將信任一個(gè)服務(wù)器。
使用keytool安裝一個(gè)認(rèn)證
1.保存認(rèn)證。
2.將認(rèn)證文件拷貝到MDS服務(wù)所在計(jì)算機(jī)上的C:\Java\j2re1.4.2\lib\security文件夾。
3.為了將認(rèn)證導(dǎo)入到鍵存儲(chǔ)里,請(qǐng)使用keytool,它可以在JREbin文件夾下找到,例如C:\Java\j2re1.4.2\bin.例如,輸入:
keytool-import-file
訪問(wèn)[url]http://java.sun.com/j2se/1.3/docs/tooldocs/win32/keytool.html[/url]獲得更多關(guān)于keytool的信息。
編碼轉(zhuǎn)化器
BlackBerryMDS支持插件的Java應(yīng)用程序,稱(chēng)為編碼轉(zhuǎn)化器,它處理BlackBerry設(shè)備發(fā)送和接收的數(shù)據(jù)。
MDS服務(wù)提供下列缺省的編碼轉(zhuǎn)化:
編碼轉(zhuǎn)化名
描述
WML>WMLC
將.wml(WirelessMarkupLanuage)轉(zhuǎn)化為一個(gè)壓縮的格式。
WMLScript>WMLScriptC
將MIDlet應(yīng)用程序?yàn)锽lackBerry格式。
JAD>COD:XML>WBXML
將xml文件轉(zhuǎn)化為下面的WAP二進(jìn)制XML(.wbxml)MIME類(lèi)型:application/vnd.wap.wbxml..
SVG>PME
將可svg(ScalableVectorGraphics)轉(zhuǎn)化為BlackBerry設(shè)備支持的pme(PlazmicMediaEngine)二進(jìn)制格式.
圖像編碼轉(zhuǎn)化
將下列圖像的文件類(lèi)型轉(zhuǎn)化為png文件:
Jpeg
Gif
Tiff
Pgm
Ppm
pnm:包含ASCII和二進(jìn)制pbm,pgm和ppm文件
ico
wbmp
pbm
wbmp
bmp
注:圖像編碼轉(zhuǎn)化器將先前的圖像格式轉(zhuǎn)化為下面的.PNGMIME類(lèi)型:image/vnd.rim.png.
你也可以編寫(xiě)自己的編碼轉(zhuǎn)化器完成客戶化數(shù)據(jù)的處理.例如,如果你的應(yīng)用程序正在和服務(wù)器交換數(shù)據(jù),而服務(wù)器不是為BlackBerry設(shè)備設(shè)計(jì)的,并且發(fā)送到服務(wù)器端的數(shù)據(jù)對(duì)BlackBerry設(shè)備來(lái)說(shuō)沒(méi)有合適的格式.那么你可能編寫(xiě)一個(gè)編碼轉(zhuǎn)化器.
一個(gè)編碼器可能改變數(shù)據(jù)格式或刪除冗余信息來(lái)降低網(wǎng)絡(luò)流量,并且支持BlackBerry設(shè)備上的簡(jiǎn)單應(yīng)用程序.例如,你可以編寫(xiě)一個(gè)編碼轉(zhuǎn)化器將HTML內(nèi)容轉(zhuǎn)化為WML。.#p#
數(shù)據(jù)轉(zhuǎn)化處理
如果你專(zhuān)門(mén)編寫(xiě)一個(gè)服務(wù)器端的應(yīng)用程序支持一個(gè)BlackBerry設(shè)備上客戶應(yīng)用程序,編碼轉(zhuǎn)化器就不需要了.你可以設(shè)計(jì)一個(gè)服務(wù)器應(yīng)用程序一合適的格式輸出數(shù)據(jù).
在發(fā)送數(shù)據(jù)到BES之前,你也可以將數(shù)據(jù)處理作為一單獨(dú)的服務(wù)器端進(jìn)程的一部分.
編碼轉(zhuǎn)化器API
主要的編碼轉(zhuǎn)化器類(lèi)
描述
HttpContentTranscoder
此類(lèi)提供方法來(lái)控制HTTP請(qǐng)求和響應(yīng)的內(nèi)容和屬性.
HttpContentTranscoderException
本異常的拋出說(shuō)明編碼轉(zhuǎn)化工程不成功.BlackBerry設(shè)備將把本異常作為IOException拋出.
HttpHeader
本類(lèi)提供方法對(duì)HTTP請(qǐng)求和響應(yīng)的消息頭進(jìn)行操作.
HttpParameter
本類(lèi)代表了HTTP查詢參數(shù).它提供獲取和設(shè)置參數(shù)名和值.
HttpRequest
本類(lèi)擴(kuò)展了HttpTransmission類(lèi),它代表了一個(gè)包含頭,參數(shù)和內(nèi)容的HTTP請(qǐng)求.
HttpResponse
本類(lèi)擴(kuò)展了HttpTransmission類(lèi),它代表了一個(gè)包含頭,參數(shù)和內(nèi)容的HTTP響應(yīng).
HttpTransmission
本類(lèi)提供獲取和設(shè)置內(nèi)容,頭,以及HTTP請(qǐng)求和響應(yīng)的參數(shù).
參看API參考獲得更多信息.
創(chuàng)建一個(gè)HTTP內(nèi)容編碼轉(zhuǎn)化器
為了創(chuàng)建一個(gè)HTTP內(nèi)容編碼轉(zhuǎn)化器來(lái)全面控制HTTP請(qǐng)求與響應(yīng)內(nèi)容,擴(kuò)展HttpContentTranscoder類(lèi).本編碼轉(zhuǎn)化器也可以修改,增加,或刪除HTTP請(qǐng)求與響應(yīng)屬性.
編碼轉(zhuǎn)化器必須在net.rim.protocal.http.content.tanscoder.
編碼轉(zhuǎn)化器的位置要么在httpcontenttranscoder文件指定,要么由應(yīng)用程序指定.
處理HTTP內(nèi)容編碼轉(zhuǎn)化器異常
任何由編碼轉(zhuǎn)化器拋出的異常將作為IOException被發(fā)送到應(yīng)用程序.相關(guān)具體的消息也拷貝到IOException中.
注:為代替拋出一個(gè)異常到HTTP連接處理器,一個(gè)編碼轉(zhuǎn)化器也可能發(fā)送一個(gè)HTTP響應(yīng)到一個(gè)應(yīng)用程序,這表明發(fā)生了一個(gè)內(nèi)部的服務(wù)器錯(cuò)誤.
選擇編碼轉(zhuǎn)化器
當(dāng)BlackBerry設(shè)備請(qǐng)求內(nèi)容時(shí),MDS服務(wù)決定客戶端請(qǐng)求的內(nèi)容類(lèi)型和服務(wù)器響應(yīng)的內(nèi)容類(lèi)型的比較是否需要一個(gè)編碼轉(zhuǎn)化器.如果類(lèi)型不一樣,MDS服務(wù)檢查httpcontenttranscoder.property文件來(lái)決定一個(gè)編碼轉(zhuǎn)化器是否可用來(lái)轉(zhuǎn)化內(nèi)容.
BlackBerry設(shè)備發(fā)送的HTTP請(qǐng)求里,x-rim-transcode-content頭指定了MDS優(yōu)化服務(wù)轉(zhuǎn)化內(nèi)容的輸入格式.如果內(nèi)容遇見(jiàn)以下情形,MDS數(shù)據(jù)優(yōu)化服務(wù)將轉(zhuǎn)化內(nèi)容:
l由x-rim-transcode-content頭指定的輸入格式也HTTP請(qǐng)求的Accept頭中指定,此HTTP請(qǐng)求是MDS服務(wù)發(fā)送到服務(wù)器的請(qǐng)求.
lWeb服務(wù)器響應(yīng)一個(gè)內(nèi)容類(lèi)型,或者輸出類(lèi)型,它和BlackBerry設(shè)備接受的類(lèi)型不同.
lhttpcontenttranscoder.property文件包含了一個(gè)編碼轉(zhuǎn)化器,此編碼轉(zhuǎn)化器可以將Web服務(wù)器發(fā)送到MDS服務(wù)的內(nèi)容轉(zhuǎn)化為BlackBerry設(shè)備可接受的類(lèi)型.
為了判斷當(dāng)push內(nèi)容時(shí)一個(gè)編碼轉(zhuǎn)化器是否需要,MDS服務(wù)檢查內(nèi)容類(lèi)型(content-type)和服務(wù)器端應(yīng)用程序的x-rim-transcode-content頭.如果2者相同,MDS數(shù)據(jù)優(yōu)化服務(wù)將頭文件指定的內(nèi)容轉(zhuǎn)為為BlackBerry可以顯示的格式.
httpcontenttranscoder.property文件將輸入的格式轉(zhuǎn)化為一個(gè)給出的編碼轉(zhuǎn)化器.在下面的例子中,httpcontenttranscoder.property文件將.wml輸入格式轉(zhuǎn)化為.wbxml或.wmlc.
content-type:text/vnd.wap.wml
x-rim-transcode-content:text/vnd.wap.wml
你也可以創(chuàng)建定制的編碼轉(zhuǎn)化器來(lái)重新格式化或者轉(zhuǎn)化應(yīng)用程序請(qǐng)求的數(shù)據(jù).例如,有愧樂(lè)意編寫(xiě)一個(gè)編碼轉(zhuǎn)化器將HTML內(nèi)容轉(zhuǎn)為為WML.參看196也的”創(chuàng)建編碼轉(zhuǎn)化器”獲得更多信息.
HTTP請(qǐng)求
MDS服務(wù)使用MIME類(lèi)型決定附加到一個(gè)服務(wù)器HTTP響應(yīng)的內(nèi)容格式是否和BlackBerry設(shè)備請(qǐng)求的內(nèi)容格式相匹配.
MDS服務(wù)測(cè)試一列可用的編碼轉(zhuǎn)化器,并且擴(kuò)展Accept頭.例如,如果一個(gè)請(qǐng)求接受WML的MIME類(lèi)型和一個(gè)編碼轉(zhuǎn)化器存在的HTML-to-WML,將HTML加到Accept頭.參看195頁(yè)的”映射編碼轉(zhuǎn)化器”獲得更多信息.
在HTTP請(qǐng)求里,應(yīng)用程序可以包含2個(gè)頭來(lái)控制它接收的內(nèi)容的類(lèi)型:
lAccept頭
lContent-Transcoder頭.
頭
描述
Accept
在HTTP請(qǐng)求的Accept頭里,應(yīng)用程序列出它從內(nèi)容服務(wù)器接收的MIME類(lèi)型.例如,如果應(yīng)用程序可以接收WML或XML格式的內(nèi)容,它在HTTP請(qǐng)求里發(fā)送如下的消息頭:
Accept:text/wml,text/xml
缺省的,當(dāng)Accept頭列出了不止一個(gè)MIME類(lèi)型,MDS服務(wù)將從左到右分配引用,在這里列出的***個(gè)MIME類(lèi)型假設(shè)為優(yōu)先的.
應(yīng)用程序頁(yè)可以將質(zhì)量因子(Qualityfactor)賦值給MIME類(lèi)型來(lái)表明優(yōu)先權(quán).質(zhì)量因子范圍時(shí)0(***優(yōu)先權(quán))到1(***優(yōu)先權(quán)),例如,下面的頭表明了編譯的WML(WMLC)是優(yōu)先的,但是WML是可接受的.
Accept:text/vnd.wap.wml;q=0.5,application/vnd.wap.wmlc;q=1
Content-Transcoder
Content-Transcoder頭是一個(gè)BlackBerry頭,在內(nèi)容返回到BlackBerry設(shè)備之前,它允許應(yīng)用程序指定一個(gè)應(yīng)用到任何內(nèi)容的特定編碼轉(zhuǎn)化器.使用Content-Transcoder頭覆寫(xiě)MDS服務(wù)運(yùn)用的缺省處理來(lái)選擇一個(gè)編碼轉(zhuǎn)化器.
HTTP響應(yīng)
內(nèi)容服務(wù)器產(chǎn)生一個(gè)包含一個(gè)Content-Type頭的HTTP響應(yīng)..Content-Type頭描述了一個(gè)特定數(shù)據(jù)包的MIME類(lèi)型.例如,當(dāng)內(nèi)容服務(wù)器一HTML格式返回內(nèi)容時(shí),HTTP響應(yīng)包含一個(gè)值為text/html的Content-Type頭.
MDS服務(wù)將應(yīng)用程序的請(qǐng)求和內(nèi)容服務(wù)器的響應(yīng)進(jìn)行比較.下面的部分將描述MDS服務(wù)如何決定什么時(shí)候轉(zhuǎn)化內(nèi)容:
響應(yīng)類(lèi)型
描述
不需要編碼轉(zhuǎn)化
應(yīng)用程序發(fā)送一個(gè)請(qǐng)求獲取WML格式的內(nèi)容.請(qǐng)求包含以下的頭:
Accept:text/vnd.wap.wml
在它的響應(yīng)里,內(nèi)容服務(wù)器發(fā)送以下的頭:
Content-Type:text/vnd.wap.wml
因?yàn)榉?wù)器返回的內(nèi)容類(lèi)型與BlackBerry請(qǐng)求類(lèi)型相符,MDS服務(wù)不需要任何轉(zhuǎn)化.它將內(nèi)容毫無(wú)變化的轉(zhuǎn)發(fā)給BlackBerry設(shè)備.
需要編碼轉(zhuǎn)化
應(yīng)用程序發(fā)動(dòng)一個(gè)請(qǐng)求獲取內(nèi)容.請(qǐng)求包含一下內(nèi)容:
Accept:text/vnd.wap.wml;q=0.5,application/vnd.wap.wmlc;q=1
此消息頭表明應(yīng)用程序接受WML或者編譯的WML格式(WMLC)的內(nèi)容.
在它的響應(yīng)中,內(nèi)容服務(wù)器發(fā)送下面的頭:
Content-Type:text/vnd.wap.wml
因?yàn)榉?wù)器返回的內(nèi)容類(lèi)型與BlackBerry請(qǐng)求類(lèi)型不符,MDS服務(wù)搜索一個(gè)可以將MIME類(lèi)型(WML)轉(zhuǎn)化為優(yōu)先的MIME類(lèi)型(WMLC)的可用編碼轉(zhuǎn)化器.
如果一個(gè)適合的編碼轉(zhuǎn)化器不可用,MDS服務(wù)將WML內(nèi)容毫無(wú)變化的轉(zhuǎn)發(fā)給BlackBerry設(shè)備,因?yàn)槌跏颊?qǐng)求表明BlackBerry設(shè)備應(yīng)用程序接受WML內(nèi)容.
每個(gè)編碼轉(zhuǎn)化器都實(shí)現(xiàn)了一個(gè)方法創(chuàng)建一個(gè)哈希表,此哈希表映射作為來(lái)自內(nèi)容服務(wù)器的輸入,編碼轉(zhuǎn)化器接受的格式,以及作為輸出編碼轉(zhuǎn)化器創(chuàng)建的格式.
在啟動(dòng)時(shí),將自BlackBerry設(shè)備的HTTP請(qǐng)求轉(zhuǎn)發(fā)之前,MDS服務(wù)使用哈希表修改Accept頭域.例如,一個(gè)BlackBerry設(shè)備應(yīng)用程序使用下面的Accept頭發(fā)送一個(gè)HTTP請(qǐng)求:
Accept:application/vnd.wap.wmlc,text/vnd.wap.wmlscriptc
在審查編碼轉(zhuǎn)化器映射表之后,MDS數(shù)據(jù)優(yōu)化服務(wù)加入下面的項(xiàng)到Accept頭里:
application/vnd.wap.wmlscript,text/wml,andtext/vnd.wap.wml
Accept:application/vnd.wap.wmlc,text/vnd.wap.wmlscriptc,application/vnd.wap.wmlscript,text/wml,text/vnd.wap.wml
這個(gè)擴(kuò)展的Accept頭現(xiàn)在列出了所有內(nèi)容服務(wù)器可以提供的MIME類(lèi)型.#p#
映射編碼轉(zhuǎn)化器
httpcontenttranscoder.property文件在你的BlackBerryJDE安裝目錄的MDS\config子目錄下.它指定了MDS數(shù)據(jù)優(yōu)化服務(wù)如何管理應(yīng)用程序與內(nèi)容服務(wù)器之間的多種內(nèi)容類(lèi)型的交換.
下面是httpcontenttranscoder.property的一個(gè)實(shí)例:
text/vnd.wap.wml->application/vnd.wap.wmlc:vnd.wap.wml
text/vnd.wap.wml->application/vnd.wap.wbxml:vnd.wap.wml
text/vnd.wap.wmlscript->application/vnd.wap.wmlscriptc:wmls
text/html->application/vnd.rim.html.filtered:html
text/vnd.wap.wml:vnd.wap.wml
text/vnd.sun.j2me.app-descriptor->application/vnd.rim.cod:vnd.rim.cod
default:pass
每個(gè)入口使用了下面的格式:
在這里:
lInputType>是內(nèi)容服務(wù)器可用的MIME類(lèi)型,或者default.
lOutputType>是BlackBerry設(shè)備請(qǐng)求的MIME類(lèi)型.
lAction>是下列值之一:
n編碼轉(zhuǎn)化器包名,如vnd.wap.wml
nPass:在沒(méi)有改變下發(fā)送數(shù)據(jù).
nDiscard:放棄數(shù)據(jù),不發(fā)送它.
下面幾節(jié)解釋在httpcontenttranscoder.property文件里可能的輸入格式:
格式1
當(dāng)服務(wù)器端可用的格式和BlackBerry設(shè)備請(qǐng)求的格式不同時(shí),下面格式的入口指定了MDS完成的動(dòng)作.
InputType->OutputType:TranscoderORRSV
例如,應(yīng)用程序請(qǐng)求text/wml,但是內(nèi)容服務(wù)器只有text/xml.MDS服務(wù)找到下面的MIME類(lèi)型入口:
Text/xml->Text/wml:vnd.wap.wml
根據(jù)本入口,MDS服務(wù)必須使用vnd.wap.wml編碼轉(zhuǎn)化器將XML內(nèi)容轉(zhuǎn)化為WML.
格式2
當(dāng)服務(wù)器發(fā)送一個(gè)給定類(lèi)型的內(nèi)容,不考慮BlackBerry設(shè)備請(qǐng)求的內(nèi)容,,下面格式的入口指定了MDS完成的動(dòng)作.
InputType:TranscoderORRSV
例如,如果服務(wù)器僅有WML內(nèi)容(text/vnd.wap.xml),.MDS服務(wù)找到下面的MIME類(lèi)型入口:
text/vnd.wap.wml:vnd.wap.wml
根據(jù)本入口,MDS服務(wù)必須使用vnd.wap.wml編碼轉(zhuǎn)化器將XML內(nèi)容轉(zhuǎn)化為WML.
缺省的入口
如果MDS服務(wù)不能為一個(gè)特定的MIME類(lèi)型:
default:TranscoderorRSV
找到一個(gè)入口,一個(gè)缺省的入口指定了MDS服務(wù)完成的缺省動(dòng)作.
例如,如果MDS服務(wù)不能為defualt:pass缺省入口的內(nèi)容找到一個(gè)入口,MDS服務(wù)將內(nèi)容毫無(wú)變化的轉(zhuǎn)發(fā)給BlackBerry設(shè)備.#p#
創(chuàng)建編碼轉(zhuǎn)化器
將HTML標(biāo)記和內(nèi)容轉(zhuǎn)化為大寫(xiě)
遵循編碼轉(zhuǎn)化器包層次結(jié)構(gòu)(hierarchy)
在net.rim.protocol.http.content.transcoder.
packagenet.rim.protocol.http.content.transcoder.uppercasehtm
擴(kuò)展HTTPContentTranscoder
一個(gè)編碼轉(zhuǎn)化器的類(lèi)名必須為T(mén)ranscoder.它擴(kuò)展了HttpContentTranscoder類(lèi).
在本例中,一個(gè)公共類(lèi)Transcoder定義了HTTP內(nèi)容編碼轉(zhuǎn)化器.
publicclassTranscoderextendsHttpContentTranscoder{…}
定義HTTP頭
為HTTP頭定義常數(shù)以及編碼轉(zhuǎn)化器加到這些頭的字符串.
- privatestaticfinalStringCONTENTTYPE_HEADER_NAME="Content-Type";
- privatestaticfinalStringCONTENTLENGTH_HEADER_NAME="Content-Length";
- privatestaticfinalStringACCEPT_HEADER_NAME="Accept";
- //AddthislinetotheAcceptheaderfieldifitexistswhen
- //theBlackBerrydeviceissuesanHTTPrequest.
- privatestaticfinalStringACCEPTLINE="text/html";
- //Thislineidentifiestheoutputcontenttypethatthistranscoderproduces.
- privatestaticfinalStringOUTPUT_TYPE="text/UPPERCASEHTML";
創(chuàng)建一個(gè)輸入和輸出類(lèi)型的映射
getMapOfOutputToAcceptLine()的實(shí)現(xiàn)創(chuàng)建了一個(gè)編碼轉(zhuǎn)化器輸入和輸出類(lèi)型之間的映射.
隨著啟動(dòng),MDS服務(wù)使用映射修改Accept消息頭域.MDS服務(wù)發(fā)送一個(gè)HTTP請(qǐng)求中修改的頭到一個(gè)HTTP服務(wù)器.
- publicHashMapgetMapOfOutputToAcceptLine(){
- HashMapmapping=newHashMap();
- mapping.put(OUTPUT_TYPE,ACCEPTLINE);
- returnmapping;
- }
設(shè)置連接URL
當(dāng)BlackBerr設(shè)備請(qǐng)求一個(gè)打開(kāi)的HTTP連接時(shí),定義一個(gè)方法設(shè)置連接URL.
publicvoidsetURL(URLnewURL){
url=newURL;
}
定義BlackBerry設(shè)備的請(qǐng)求處理
在MDS服務(wù)將BlackBerry設(shè)備請(qǐng)求轉(zhuǎn)發(fā)到目標(biāo)服務(wù)器之前,transcodeDevice(HttpRequest)的實(shí)現(xiàn)定義了任何對(duì)這些請(qǐng)求的處理.下面的例子不需要處理:
一個(gè)應(yīng)用程序可以使用一個(gè)稱(chēng)為Content-Transcoder的HTTP頭請(qǐng)求一個(gè)指定的編碼轉(zhuǎn)化器,
publicvoidtranscodeDevice(HttpRequestrequest)
throwsHttpContentTranscoderException{
//Implementation.
}
定義BlackBerry設(shè)備的響應(yīng)處理
在MDS服務(wù)將BlackBerry設(shè)備響應(yīng)轉(zhuǎn)發(fā)到目標(biāo)服務(wù)器之前,transcodeDevice(HttpResponse)的實(shí)現(xiàn)定義了任何對(duì)這些響應(yīng)的處理.下面的例子不需要處理:
publicvoidtranscodeDevice(HttpResponseresponse)
throwsHttpContentTranscoderException{
//Implementation.
}
定義服務(wù)器的請(qǐng)求處理
在MDS服務(wù)將它轉(zhuǎn)發(fā)到BlackBerry設(shè)備之前,transcodeServer(HttpRequest)的實(shí)現(xiàn)定義了任何對(duì)內(nèi)容服務(wù)器請(qǐng)求的處理需求.
- publicvoidtranscodeServer(HttpRequestrequest)
- throwsHttpContentTranscoderException{
- try{
- //Retrievetherequestcontent,which,inthiscase,isinHTML.
- byte[]requestrequestContent=request.getContent();
- if(requestContent!=null){
- //ConvertthecontenttoStringobject.
- StringrequestContentAsString=new
- String(requestContent).toUpperCase();
- //ConverttherequestContentAsStringtobytesagain.
- requestContent=requestContentAsString.getBytes();
- }
- else{
- //SendanHTMLmessagetoindicatethattheserver
- //isnotrespondingwithappropriatecontent.
- StringBuffersb=newStringBuffer();
- sb.append("<HTML>\n");
- sb.append("<HEAD>\n");
- sb.append("<TITLE>UPPERCASEHTMLTRANSCODERtitle>\n");
- sb.append("HEAD>\n");
- sb.append("<BODY>\n");
- sb.append("SERVERISNOTPUSHINGAPPROPRIATECONTENT\n");
- sb.append("BODY\n");
- sb.append("HTML>\n");
- requestContent=sb.toString().getBytes();
- }
- request.setContent(requestContent);
- //UpdatetheContent-Length
- HttpHeadercontentLengthHeader=
- request.getHeader(CONTENTLENGTH_HEADER_NAME);
- if(contentLengthHeader!=null){
- contentLengthHeader.setValue(""+requestContent.length);
- }
- else{
- //TheserverdidnotsendtheContent-Length.
- //Noupdateisneeded.
- }
- //UpdatetheContent-Type.
- HttpHeadercontentTypeHeader=
- request.getHeader(CONTENTTYPE_HEADER_NAME);
- if(contentTypeHeader!=null){
- contentTypeHeader.setValue(OUTPUT_TYPE);
- }
- else{
- //AddtheContentTypehereiftheserverdoesnotspecifyone.
- request.putHeader(newHttpHeader(
- CONTENTTYPE_HEADER_NAME,OUTPUT_TYPE));
- }
- }
- catch(Throwablet){
- thrownewHttpContentTranscoderException(t.toString());
- }
- }
#p#
定義服務(wù)器的響應(yīng)處理
在MDS服務(wù)將它轉(zhuǎn)發(fā)到BlackBerry設(shè)備之前,transcodeServer(HttpResponse)的實(shí)現(xiàn)定義了包含來(lái)自于內(nèi)容服務(wù)器的內(nèi)容服務(wù)器響應(yīng)的任何處理需求.如果響應(yīng)不包含任何內(nèi)容,MDS服務(wù)將響應(yīng)毫無(wú)變化的轉(zhuǎn)發(fā)給BlackBerry設(shè)備.
- publicvoidtranscodeServer(HttpResponseresponse)
- throwsHttpContentTranscoderException{
- try{
- //Retrievetheresponsecontent,whichinthiscaseisinHTML.
- byte[]responseresponseContent=response.getContent();
- if(responseContent!=null){
- //ConvertthecontenttoStringobject.
- StringresponseContentAsString=new
- String(responseContent).toUpperCase();
- //ConverttheresponseContentAsStringtobytesagain.
- responseContent=responseContentAsString.getBytes();
- }
- else{
- //Noresponseisreceivedfromtheserver.
- StringBuffersb=newStringBuffer();
- sb.append("<HTML>\n");
- sb.append("<HEAD>\n");
- sb.append("<TITLE>UPPERCASEHTMLTRANSCODERtitle>\n");
- sb.append("HEAD>\n");
- sb.append("<BODY>\n");
- sb.append("SERVERISNOTRESPONDING\n");
- sb.append("BODY\n");
- sb.append("HTML>\n");
- responseContent=sb.toString().getBytes();
- }
- response.setContent(responseContent);
- //UpdatetheContent-Length.
- HttpHeadercontentLengthHeader=
- response.getHeader(CONTENTLENGTH_HEADER_NAME);
- if(contentLengthHeader!=null){
- contentLengthHeader.setValue(""+responseContent.length);
- }
- else{
- //ServerdidnotsendContent-Lengthsonoupdateisrequired.
- }
- //UpdatetheContent-Type.
- HttpHeadercontentTypeHeader=
- response.getHeader(CONTENTTYPE_HEADER_NAME);
- if(contentTypeHeader!=null){
- contentTypeHeader.setValue(OUTPUT_TYPE);
- }
- else{
- //AddtheContentTypehere.
- response.putHeader(new
- HttpHeader(CONTENTTYPE_HEADER_NAME,OUTPUT_TYPE));
- }
- }
- catch(Throwablet){
- thrownewHttpContentTranscoderException(t.toString());
- }
- }
編譯和安裝編碼轉(zhuǎn)化器
1.編譯編碼轉(zhuǎn)化器的類(lèi)文件,在類(lèi)路徑里包含bmds.jar.
2.為編譯編碼轉(zhuǎn)化器創(chuàng)建一個(gè)jar文件.
3.以下面的任一方式安裝編碼轉(zhuǎn)化器.jar文件
lBES:將一個(gè)編碼轉(zhuǎn)化器.jar文件加到JRE的lib\jar目錄下.此.jar文件必須可訪問(wèn)JavaVM.
l模擬器:將一個(gè)編碼轉(zhuǎn)化器.jar文件加到BlackBerryJDE的MDS\classpath目錄下.
4.打開(kāi)httpcontenttranscoderslist.property文件,此文件在BlackBerryJDE安裝目錄的MDS\Config子目錄下.
5.為了指定何時(shí)使用編碼轉(zhuǎn)化器,加入一個(gè)或多個(gè)入口,.例如,為了使用uppercasehtml編碼轉(zhuǎn)化器將HTML內(nèi)容轉(zhuǎn)化為大寫(xiě)的HTML,加入下面的入口:
text/html->text/UPPERCASEHTML:uppercasehtml
6.保存屬性文件.
7.重啟MDS服務(wù)或BlackBerryMDS模擬器.
- BlackBerry開(kāi)發(fā)中Windows+eclipse環(huán)境配置及Helloworld
- 九步實(shí)現(xiàn)BlackBerry開(kāi)發(fā)程序發(fā)布應(yīng)用到app world
- BlackBerry開(kāi)發(fā)中七步實(shí)現(xiàn)創(chuàng)建app world賬號(hào)
- BlackBerry開(kāi)發(fā)環(huán)境中javaloader使用詳解
- 黑莓開(kāi)發(fā)中黑莓手機(jī)程序訪問(wèn)網(wǎng)絡(luò)能走代理服務(wù)器的三種方式