2016-09-13 8 views
1

私が見つけたすべてのコードを2日間検索し、テストしました。 jsonファイルをサーブレットに送信しています。データが正しく送信されていることを確認しています。私は何らかの理由でリクエストの入力ストリームからそれらを取得できません。JSONデータをサーブレットに送信するとヌル文字列になる

ここ

データの送信者からのコード:

{ 
... 
    HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 
    con.setRequestMethod("POST"); 
    con.setRequestProperty("User-Agent", "Mozilla/5.0"); 
    con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); 
    con.setDoOutput(true); 
    DataOutputStream wr = new DataOutputStream(con.getOutputStream()); 

    Gson gson = new Gson(); 
    String jsonString = gson.toJson(<POJO_to_send>).toString(); 
    wr.writeBytes(URLEncoder.encode(jsonString,"UTF-8")); 

    wr.flush(); 
    wr.close();   

    String responseMessage = con.getResponseMessage(); 
... 
} 

サーブレットからコード:私はまだ見つかっていない

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    String s = ""; 
    StringBuilder sb = new StringBuilder(); 
    BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream())); 

    while((s=br.readLine())!=null) { 
     s = br.readLine(); 
     sb.append(s); 
    } 

    String jsonString = sb.toString(); 
    if (jsonString != null) { 
     jsonString = br.readLine(); 
    }else{ 
     IOException ioex = new IOException("Error reading data."); 
     throw(ioex); 
    } 
} 

何らかの理由で、sb.toString()はnullになります値は、sbが空の文字列であるためです。デバッグから私は、要求の入力ストリームのbuf値が空ではないように見えます(少なくとも、そこにはいくつかのバイトデータがあり、送信者のデータ出力ライターと同じであると思われます)。

私が逃したエラーを見ましたか?サーブレットに到達する前にデータをチェックすることはできますか(おそらくエンコーディングはどこかで失敗します)?

アドバイス/アイデアはありますか?

はOutputStreamに何も書き込みがありません、あなたは

+1

?私は書き込みを参照してください。 – stdunbar

+0

私が間違っていない場合、wr.writeBytes(URLEncoder.encode(jsonString、 "UTF-8"))でなければなりません。 –

+0

改行文字が書かれた後にあなたのJSON文字列に魔法のように追加されたと思いますか? –

答えて

0

stdunbarが言ったようにお願いします。ありがとうございましたjoop-eggenすべての提案。

は、送信のために次のことを試してみてください。

{ 
    ... 
     Gson gson = new Gson(); 
     DataOutputStream wr = new DataOutputStream(resp.getOutputStream()); 
     String jsonString = gson.toJson(<POJO_to_send>).toString(); 

     HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 
     con.setRequestMethod("POST"); 
     con.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); 
     conn.setRequestProperty("Content-Length", String.valueOf(jsonString.length())); 
     con.setDoOutput(true); 

     wr.writeBytes(jsonString); 
     wr.flush(); 
     wr.close();  

     String responseMessage = con.getResponseMessage(); 
    ... 
    } 

および取得するための:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(), "utf-8")); 
    String sb = new String(); 
      try { 
      String line = ""; 
      while ((line = br.readLine()) != null) 
      sb += line; 
      } catch (Exception e) { 
      e.printStackTrace(); 
      } 

     String jsonString = sb; 
} 
+0

ああ、答えは今より良い;) – Fr333du

+0

編集されました。 'doGet(...)'の代わりに 'doPost(...)'を使いますか?また、 'jsonString'の値が' String jsonString = gson.toJson()の後であることを確認しましたか?toString(); '? – Fr333du

+0

@RealSkeptic実際にはこれは私に少し困惑しました。私はPOSTを使用するリクエストメソッドを設定してから、私はdoPost実行サーバー側を期待していましたが、代わりにリクエストはdoGetを経由します。 –

0

A DataOutputStreamのは反対の効果です。コンテンツタイプと文字セットを渡さないと、コードは次のようになります。

POSTの場合、HTMLフォームパラメータ、たとえばjson=...が必要です。 申し訳ありませんが、フォームデータを投稿する場合は、フォーム作成が必要です。そのようにしてみましょう。一つはサーブレットでdoPost使用しなければならない要求メソッドPOST毎場合

HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 
con.setRequestMethod("POST"); 
con.setRequestProperty("User-Agent", "Mozilla/5.0"); 
con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); 
con.setDoOutput(true); 
con.connect(); // ............. 
OutputStream out = con.getOutputStream(); 

Gson gson = new Gson(); 
String jsonString = gson.toJson(<POJO_to_send>).toString() + "\r\n"; 
out.write(jsonString.getBytes(StandardCharsets.UTF_8)); 
out.close(); 

String responseMessage = con.getResponseMessage(); 

あなたが他のサーバー用のTomcatまたは関連するプロパティを使用している場合は、server.xmlの性質 maxpostSize=""を更新する必要が
protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 

    BufferedReader br = new BufferedReader(
     new InputStreamReader(request.getInputStream(), StandardCharsets.UTF_8)); 

    StringBuilder sb = new StringBuilder(); 
    String s; 
    while ((s = br.readLine()) != null) { 
     sb.append(s).append("\n"); 
    } 

    String jsonString = sb.toString(); 
} 
+0

私はあなたに同意しますが、con.setRequestMethod( "POST" )は動作せず、要求はGETとして送信されます。また、次のセッターの呼び出しは動作していないように見えますが、なぜ私は本当に理解できません。 –

+1

あなたのコメントに感謝します。忘れられたのは、 'connect()'でした。私はそれを追加しました。それはパラメータ、ヘッダーを送信し、実際の接続を開始します。 'openConnection ... connect'は普通は忘れないものです。 –

関連する問題