博洋java培訓(xùn)篇:返回xml非chunked模式2013-10-23 14:11:07 博洋java培訓(xùn)篇:返回xml非chunked模式 在與第三方合作的過程中,,響應(yīng)報文是xml格式的,。最開始沒有進行處理,,對方收到的報文是chunked模式。對方說目前不支持這個模式,,于是我就去尋找了什么叫chunked模式,,以及怎么去避免使用這種模式。 簡單介紹一下chunked: Transfer-Encoding: chunked 表示輸出的內(nèi)容長度不能確定,,普通的靜態(tài)頁面,、圖片之類的基本上都用不到這個。 但動態(tài)頁面就有可能會用到,,但我也注意到大部分asp,php,asp.net動態(tài)頁面輸出的時候大部分還是使用Content-Length,,沒有使用Transfer-Encoding: chunked。 不過如果結(jié)合:Content-Encoding: gzip 使用的時候,,Transfer-Encoding: chunked還是比較有用的,。 記得以前實現(xiàn):Content-Encoding: gzip 輸出時,先把整個壓縮后的數(shù)據(jù)寫到一個很大的字節(jié)數(shù)組里(如 ByteArrayOutputStream),,然后得到數(shù)組大小 -> Content-Length,。 如果結(jié)合Transfer-Encoding: chunked使用,就不必申請一個很大的字節(jié)數(shù)組了,,可以一塊一塊的輸出,,更科學(xué),占用資源更少,。 這在http協(xié)議中也是個常見的字段,,用于http傳送過程的分塊技術(shù),原因是http服務(wù)器響應(yīng)的報文長度經(jīng)常是不可預(yù)測的,,使用Content-length的實體搜捕并不是總是管用,。 分塊技術(shù)的意思是說,實體被分成許多的塊,,也就是應(yīng)用層的數(shù)據(jù),,TCP在傳送的過程中,不對它們做任何的解釋,,而是把應(yīng)用層產(chǎn)生數(shù)據(jù)全部理解成二進制流,,然后按照MSS的長度切成一分一分的,一股腦塞到tcp協(xié)議棧里面去,,而具體這些二進制的數(shù)據(jù)如何做解釋,,需要應(yīng)用層來完成,所以在這之前,,一快整體應(yīng)用層的數(shù)據(jù)需要等它分成的所有TCP segment到達對方,,重新組裝后,,應(yīng)用程序才使用自己的解碼方法還原它們。 HTTP1.1采用了持久的連接,,也就是一次TCP的連接不馬上釋放,,允許許多的請求跟響應(yīng)在一個TCP的連接上發(fā)送,所以客戶機與服務(wù)器需要某種方式來標(biāo)示一個報文在哪里結(jié)束和在下一個報文在哪里開始,。簡單的方法是使用呢content-length,但這只有當(dāng)報文長度可以預(yù)先判斷的時候才起作用,,而對于動態(tài)的內(nèi)容或者在發(fā)送數(shù)據(jù)前不能判定長度的情況下,,可以使用分塊的方法來傳送編碼。 Web服務(wù)器有時生成HTTPResponse無法在Header就確定消息大小的,,這時一般來說服務(wù)器將不會提供Content-Length的頭信息,,而采用Chunked編碼動態(tài)的提供body內(nèi)容的長度。進行Chunked編碼傳輸?shù)腍TTP Response會在消息頭部設(shè)置:Transfer-Encoding: chunked,,表示Content Body將用Chunked編碼傳輸內(nèi)容,。 簡而言之:在httpresponse傳輸過程中,不知道要傳輸?shù)膬?nèi)容的具體大小,,所以就采用chunked(分塊)模式,,這樣,有點類似于流媒體的趕腳,。一段一段的傳輸,。 那么,根據(jù)這個含義,,想要去掉chunked模式,,我們只需要把要傳輸?shù)膬?nèi)容的大小告訴httpresponse即可了,就是: response.setContentLength(1000); response.setContentType("text/html;charset=UTF-8");// 解決中文亂碼 response.setCharacterEncoding("UTF-8");//設(shè)置字符集編碼 response.setContentLength(rspString.length());//設(shè)置傳輸內(nèi)容大小(注意:要在printWriter = response.getWriter();之前) //以下是將內(nèi)容進行傳輸了 printWriter = response.getWriter(); printWriter.print(rspString); printWriter.flush(); printWriter.close(); 更多JAVA技術(shù)知識可到博洋教育網(wǎng)站查詢,! 博洋教育(http://www./)教師簡介:謝君 專業(yè)特長:精通J2SE中的I/O流編程,、網(wǎng)絡(luò)編程、線程技術(shù)及J2EE平臺架構(gòu)等,。熟練運用J2EE平臺架構(gòu)中的各項技術(shù)構(gòu)建和部署J2EE系統(tǒng),;對使用Struts、JDBC,、Hibernate,、EJB、IBatis,、Spring等框架技術(shù)構(gòu)建有豐富經(jīng)驗,。熟練使用Oracle和SQLServer數(shù)據(jù)庫,熟悉Oracle的體系框架架構(gòu),;熟練使用Exp/Imp,、Rman,、OS等對數(shù)據(jù)庫進行備份和回復(fù)的處理。熟練開源的各種應(yīng)用部署工具和配置應(yīng)用程序,。 |
|