2017-12-14 20 views
0

私はthis Stack Overflow answerのコードを採用して、AndroidアプリからPython/DjangoサーバにJSONを正常にPOSTしています。ここでPOSTコードの私(非常に近い)の適応は次のとおりです。HttpResponseにアクセスする方法HttpURLConnection InputStream by Androidで返されますか?

// In my activity's onCreate method 
try { 
    JSONObject obj = new JSONObject(strJSON); 
    new postJSON().execute("https://www.placeholder.com/generate_json", obj.toString()); 
} catch (Throwable t) { 
    Log.e("JSON Error", "Could not parse malformed JSON: " + strJSON); 
} 

// Outside onCreate 
private class postJSON extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... params) { 
     String data = ""; 
     HttpURLConnection httpURLConnection = null; 

     try { 
      httpURLConnection = (HttpURLConnection) new URL(params[0]).openConnection(); 
      httpURLConnection.setRequestMethod("POST"); 
      httpURLConnection.setDoOutput(true); 

      DataOutputStream wr = new DataOutputStream(httpURLConnection.getOutputStream()); 
      wr.writeBytes("PostData=" + params[1]); 
      wr.flush(); 
      wr.close(); 

      InputStream in = httpURLConnection.getInputStream(); 
      InputStreamReader inputStreamReader = new InputStreamReader(in); 

      int inputStreamData = inputStreamReader.read(); 
      while (inputStreamData != -1) { 
       char current = (char) inputStreamData; 
       inputStreamData = inputStreamReader.read(); 
       data += current; 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (httpURLConnection != null) { 
       httpURLConnection.disconnect(); 
      } 
     } 
     return data; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     Log.e("TAG", result); 
    } 
} 

私は今、私はdataに含まれていると思います(私はこれについてはよく分からない)、サーバから返されたのHttpResponseに、アクセスしたいです。 dataにHttpResponseが含まれている場合は、Toastで印刷したいと思います。

dataには既にサーバーのHttpResponseが含まれていますか、それともInputStreamから取得するために追加の手順を実行する必要がありますか?既に存在する場合は、コードをHttpResponse(つまりdata)をトーストに印刷するためのコードはどこに置く必要がありますか?

+0

はい '文字列data'は応答が含まれています。そして、それはdoInBackgroundによって返されます。したがって、onPostExecuteのパラメータとして使用できます。それを焼く。すでにログオンしています。ログには、実際に期待されているJSONかどうかが分かります。あなたはすでにそれを記録しているので、私はあなたの問題をもう理解しません。 – greenapps

+0

アドバイスをいただきありがとうございます! 'onPostExecute'で' result'を使用して、応答を表示して操作する必要がありますか? – ThanksForTheHelpAgain

+0

確かに。どのようにそれを行う必要がありますそう。 – greenapps

答えて

0

変数dataが非同期から結果を取得するための多くのパターンがありますが、サーバーからのレスポンスボディを含むStringで、メソッドに変数resultとしてあなたのUIスレッド上でonPostExecute

あなたに利用できるようになります仕事。これを行う簡単な方法の1つは、このアプローチをトーストを得るために試してみてください。

は、次のようなタスクのあなたの実行を書く:

// In your activity's onCreate method 
try { 
    JSONObject obj = new JSONObject(strJSON); 
    new postJSON() { 

     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
      Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show(); 
     } 

    }.execute("https://www.placeholder.com/generate_json", obj.toString()); 
} catch (Throwable t) { 
    Log.e("JSON Error", "Could not parse malformed JSON: " + strJSON); 
} 
+0

'非同期タスクにコールバックを追加して、完了した結果を処理するパターンはたくさんあります。これを行う簡単な方法が1つあります。コールバックを追加したり使用したりしていません。 – greenapps

+1

これを投稿していただきありがとうございます!私はonCreateメソッドでonPostExecuteを使用できることに気付きませんでした。私はちょうどこのコードを実行し、エラーなしで起動しましたが、ログには私のサーバーに接続の問題があることが示されました。私はあなたがコードの作品だと思うが、私は私のサーバーをできるだけ早く修正して確認します。 – ThanksForTheHelpAgain

関連する問題