2013-05-13 103 views
4

我有一個響應Twilio API的Java Servlet。似乎Twilio不支持我的回覆所使用的分塊傳輸。我如何避免使用Transfer-Encoding: chunked如何在沒有傳輸編碼的情況下發送HTTP響應:分塊?

這裏是我的代碼:

// response is HttpServletResponse 
// xml is a String with XML in it 
response.getWriter().write(xml); 
response.getWriter().flush(); 

我使用碼頭的Servlet容器。

+0

什麼是您的應用服務器/ Servlet容器? – 2013-05-13 23:25:42

+0

@AnthonyAccioly http://www.eclipse.org/jetty/ – Adam 2013-05-13 23:50:34

回答

3

嘗試在寫入流之前設置Content-length。不要忘記按正確的編碼來計算的字節數,如:

final byte[] content = xml.getBytes("UTF-8"); 
response.setContentLength(content.length); 
response.setContentType("text/xml"); // or "text/xml; charset=UTF-8" 
response.setCharacterEncoding("UTF-8"); 

final OutputStream out = response.getOutputStream(); 
out.write(content); 
+1

'setCharacterEncoding'可能沒有必要,因爲你正在寫入原始字節。內容類型應該包含編碼:「text/xml; charset = UTF-8」。 – ZhongYu 2013-05-14 00:34:52

+0

謝謝@ zhong.j.yu,用您的建議更新了答案...用戶可以直接使用MIME類型設置字符集或使用[setCharacterEncoding](http://docs.oracle.com/javaee/6/api /javax/servlet/ServletResponse.html#setCharacterEncoding(java.lang.String)),它將覆蓋Content-type頭。 – 2013-05-14 02:08:32

7

我相信,當Jetty不知道響應內容長度和/或使用持續連接時,它將使用分塊響應。爲了避免分塊,您需要設置響應內容長度,或通過在響應中設置「Connection」:「close」標頭來避免持久連接。

+2

打敗我吧。 @亞當,如果我的代碼工作,請接受cmbaxter的答案。 – 2013-05-13 23:58:35

+3

@AnthonyAccioly,現在_that_是優雅的SO禮儀 – 2013-05-14 00:00:08

+2

@AnthonyAccioly我將上調cmbaxter的答案。但是,我確實在尋找一個代碼示例,顯示要設置的內容長度,所以儘管兩者都是正確的,但您的答案會更好,因此我會接受您的答案。 – Adam 2013-05-28 20:26:16

1

容器將決定自己使用Content-Length或傳輸編碼基礎上的數據的大小,通過使用被寫入WriteroutputStream。如果數據的大小大於HttpServletResponse.getBufferSize(),則響應將被中繼。否則,將使用Content-Length

就你而言,只需刪除第2個沖洗碼即可解決你的問題。

相關問題