返回xml非chunked模式

2021-06-17 17:04:22 字數 1876 閱讀 4764

在與第三方合作的過程中,響應報文是xml格式的。最開始沒有進行處理,對方收到的報文是chunked模式。對方說目前不支援這個模式,於是我就去尋找了什麼叫chunked模式,以及怎麼去避免使用這種模式。

簡單介紹一下chunked:

transfer-encoding: chunked 表示輸出的內容長度不能確定,普通的靜態頁面、之類的基本上都用不到這個。

但動態頁面就有可能會用到,但我也注意到大部分asp,php,asp.net動態頁面輸出的時候大部分還是使用content-length,沒有使用transfer-encoding: chunked。

不過如果結合:content-encoding: gzip 使用的時候,transfer-encoding: chunked還是比較有用的。

記得以前實現:content-encoding: gzip 輸出時,先把整個壓縮後的資料寫到乙個很大的位元組陣列裡(如 bytearrayoutputstream),然後得到陣列大小 -> content-length。

如果結合transfer-encoding: chunked使用,就不必申請乙個很大的位元組陣列了,可以一塊一塊的輸出,更科學,占用資源更少。

這在http協議中也是個常見的字段,用於http傳送過程的分塊技術,原因是http伺服器響應的報文長度經常是不可**的,使用content-length的實體搜捕並不是總是管用。

分塊技術的意思是說,實體被分成許多的塊,也就是應用層的資料,tcp在傳送的過程中,不對它們做任何的解釋,而是把應用層產生資料全部理解成二進位製流,然後按照mss的長度切成一分一分的,一股腦塞到tcp協議棧裡面去,而具體這些二進位制的資料如何做解釋,需要應用層來完成,所以在這之前,一快整體應用層的資料需要等它分成的所有tcp  segment到達對方,重新組裝後,應用程式才使用自己的解碼方法還原它們。

http1.1採用了持久的連線,也就是一次tcp的連線不馬上釋放,允許許多的請求跟響應在乙個tcp的連線上傳送,所以客戶機與伺服器需要某種方式來標示乙個報文在**結束和在下乙個報文在**開始。簡單的方法是使用呢content-length,但這只有當報文長度可以預先判斷的時候才起作用,而對於動態的內容或者在傳送資料前不能判定長度的情況下,可以使用分塊的方法來傳送編碼。     

web伺服器有時生成httpresponse無法在header就確定訊息大小的,這時一般來說伺服器將不會提供content-length的頭資訊,而採用chunked編碼動態的提供body內容的長度。進行chunked編碼傳輸的http response會在訊息頭部設定:

transfer-encoding: chunked,表示content body將用chunked編碼傳輸內容。

簡而言之:在httpresponse傳輸過程中,不知道要傳輸的內容的具體大小,所以就採用chunked(分塊)模式,這樣,有點類似於流**的趕腳。一段一段的傳輸。

那麼,根據這個含義,想要去掉chunked模式,我們只需要把要傳輸的內容的大小告訴httpresponse即可了,就是:

response.setcontentlength(1000);

response.setcontenttype("text/html;charset=utf-8");// 解決中文亂碼

response.setcharacterencoding("utf-8");//設定字符集編碼

response.setcontentlength(rspstring.length());//設定傳輸內容大小(注意:要在printwriter = response.getwriter();之前)

//以下是將內容進行傳輸了

printwriter = response.getwriter();

printwriter.print(rspstring);

printwriter.flush();

printwriter.close();

Django讀取XML並返回XML

用django對ncclient的介面進行封裝,需要post的資料為xml格式,讀取後傳給ncclient介面的格式仍然是讀取的xml並返回xml格式的響應 我用的xml文字,如 xmlns urn ietf params xml ns netconf base 1.0 xmlns xc urn i...

PHP AJAX 返回XML資料

例子 利用ajax間接訪問資料庫,查出nation表中的資料,返回xml資料,並將nation表中的資料顯示在下拉列表框中 外層建乙個下拉列表框 1 select id sel 2select jqurey document ready function e 將 加入到下拉列表中的 sel html...

GoLang解析XML,非Unmarshal方法

看網上好多都是用的unmarshal函式,但是對於有些不知道節點數量的情況,unmarshal函式還是無法很好完成。所以自己寫了個方法,在這裡記下來,免得忘了。package loader import encoding xml errors fmt io strings node xml的節點結構...