2017-03-17 204 views
0

我有一個http服務器接收POST請求並從mysql數據庫提取數據。
這是服務器的相關部分:
utf8中的HTTP HTTP服務器響應

@Override 
    public void handle(HttpExchange he) throws IOException { 
     JSONArray jsonArr = null; 
     InputStreamReader isr = new InputStreamReader(he.getRequestBody(), "utf-8"); 
     BufferedReader br = new BufferedReader(isr); 
     String query = br.readLine(); 
     JSONObject postData=null; 
     try { 
      postData=Constants.parseQuery(query); 
     } catch (JSONException e) { 
      System.out.println("ERROR:  SelectHandler,handle,parseQuery, on query: " + query); 
     } 
//  Object t=params.entrySet(). 
     try { 
      query=Constants.getSelectQuery(postData); 
      jsonArr = MySQLQueryExecutor.getInstance().getItems(query); 
     } catch (JSONException e) { 
      System.out.println("ERROR:  SelectHandler,handle,getItems, on query: " + query); 
     } 

     String encoding = "UTF-8"; 
     String ret=jsonArr.toString(); 
     he.getResponseHeaders().set("Content-Type", "application/json; charset=" + encoding); 

     he.sendResponseHeaders(200, ret.length()); 
     System.out.println(ret); 
     OutputStream os = he.getResponseBody(); 
     ret= URLDecoder.decode(ret, "UTF-8"); 
     os.write(ret.toString().getBytes()); 
     os.close(); 
    } 

我可以看到,服務器處理請求併發送響應,但在客戶端上我得到一個錯誤。
錯誤是由於響應中的utf8字符(希伯來字符,當我忽略它們時,錯誤消失了)。
我該如何解決這個問題?這是服務器還是客戶端問題?

+2

'URLDecoder'完全不是你想要的。您需要編寫字符串的UTF8字節。 – SLaks

+0

os.write(ret.getBytes(encoding));沒有幫助,如果那你的意思 –

+0

你實際收到什麼迴應? – SLaks

回答

1

長度也是錯誤的。有點進一步:

String encoding = "UTF-8"; 
    String ret = jsonArr.toString(); 
    he.getResponseHeaders().set("Content-Type", "application/json; charset=" + encoding); 

    //ret= URLDecoder.decode(ret, "UTF-8"); 
    byte[] bytes = ret.getBytes(StandardCharsets.UTF_8); 
    he.sendResponseHeaders(200, bytes.length); 
    System.out.println(ret); 
    OutputStream os = he.getResponseBody(); 
    os.write(bytes); 
    os.close(); 
+0

這對我有效。謝謝! –

+0

...但它仍然有一個破碎的內容類型。 –

+0

mime類型應該只是'application/json'或一個回調'application/javascript'。該字符集僅用於'text/...'。默認爲json _is_ UTF-8。是否有一個'addResponseHeaders'來添加兩個頭文件? –

1

a)您有一個破損的Content-Type標題字段。 application/json中沒有字符集參數。見https://greenbytes.de/tech/webdav/rfc7159.html#rfc.section.11

b最後一句)您需要發送從String.getBytes獲得的字節(「UTF-8」)和

C)這也是如何計算內容長度(編碼爲UTF經過這麼-8個字節,而不是之前)。

+0

os.write(ret.getBytes(encoding));不起作用。我也刪除了損壞的標題。不過,同樣的錯誤。 –

+0

不確定你的意思,但你寫了Content-Tye而不是Content-Type。 – Qix

+0

Content-Type標頭是正確的,你總是可以爲JSON MIME類型添加一個字符集。根據RFC 4627,只有默認編碼是UTF,所以在這裏不需要。 –