2017-03-17 18 views
0

私はPOSTリクエストを受け取り、mysqlデータベースからデータを取得するhttpサーバーを持っています。
これは、サーバーの関連部分である:
utf8でのJava 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

...でもContent-Typeはまだ壊れています。 –

+0

mimeの型は単に 'application/json'またはコールバック' application/javascript'にする必要があります。 charsetは 'text/...'のためのものです.. json _is_ UTF-8のデフォルトです。 2つのヘッダを追加する 'addResponseHeaders'はありますか? –

1

a)Content-Typeヘッダーフィールドが壊れています。 application/jsonにはcharsetパラメータはありません。これは、コンテンツの長さを計算する方法もあります(そうUTFとして符号化後)あなたがするString.getBytes(「UTF-8」)から取得したバイトと

Cを送信する必要があります)https://greenbytes.de/tech/webdav/rfc7159.html#rfc.section.11

Bで最後の文を参照してください。 -8バイト、前ではありません)。

+0

os.write(ret.getBytes(encoding));動作しません。私も壊れたヘッダーを削除しました。それでも、同じエラー。 –

+0

あなたがそれを意味するのかどうかは分かりませんが、あなたは 'Content-Type'の代わりに' Content-Tye'を書いています。 – Qix

+0

Content-Typeヘッダーは正しいですが、JSON MIMEタイプの文字セットもいつでも追加できます。 RFC 4627によれば、デフォルトのエンコーディングのみがUTFなので、ここでは必要ありません。 –

関連する問題