HttpExchange對象的getRequestBody方法返回一個InputStream。正確閱讀「身體」還有很多工作要做。它是一個Java庫+對象+方法,能夠提前一步,並以可立即使用的Java String的形式返回主體(在服務器端)?如何在服務器端將HTTP POST請求主體作爲Java字符串獲取?
謝謝!
HttpExchange對象的getRequestBody方法返回一個InputStream。正確閱讀「身體」還有很多工作要做。它是一個Java庫+對象+方法,能夠提前一步,並以可立即使用的Java String的形式返回主體(在服務器端)?如何在服務器端將HTTP POST請求主體作爲Java字符串獲取?
謝謝!
你試過這個嗎?
InputStreamReader isr = new InputStreamReader(exchange.getRequestBody(),"utf-8");
BufferedReader br = new BufferedReader(isr);
String value = br.readLine();
您可以使用Commons IO的org.apache.commons.io.IOUtils.toString(InputStream, String)
在一行中完成此操作。 (它不可能與HTTP工作保持活動雖然)
編輯:
如果你想直接去JSON,還有一堆Web服務棧,將做反編排爲你的。嘗試
CXF/JAX-RS:http://cxf.apache.org/docs/jax-rs-data-bindings.html#JAX-RSDataBindings-JSONsupport
InputStreamReader isr = new InputStreamReader(t.getRequestBody(),"utf-8");
BufferedReader br = new BufferedReader(isr);
// From now on, the right way of moving from bytes to utf-8 characters:
int b;
StringBuilder buf = new StringBuilder(512);
while ((b = br.read()) != -1) {
buf.append((char) b);
}
br.close();
isr.close();
// The resulting string is: buf.toString()
// and the number of BYTES (not utf-8 characters) from the body is: buf.length()
StringBuilder buf = new StringBuilder(); – Joshua
如果您在使用Spring MVC,您可以使用@RequestBody標註上這是一個String類型的方法參數。例如。
@RequestMapping(value = "/something", method = RequestMethod.POST)
public void doSomething(@RequestBody String requestBodyString) {
// does something..
}
是的,我試過了。問題是身體不以CR/LF結束。我通過使用帶有內容長度的read(char [])方法找到了一個解決方案,並且它大致起作用。我想知道這是不是一種完成這個閱讀工作的方法。 – Joshua
您應該從HTTP標頭獲取編碼,而不是假設它是UTF-8。 – artbristol