調査後も、JSON POSTリクエストをサーバーに送信できません。
私はすでにいくつかの古い答えを試しました:
Java-POSTメソッドで簡単に)HTTPパラメータを送信する
[Android] -POST Json with HttpUrlConnection
HttpUrlConnectionによってサーバーにユーザーデータを登録するためのPostリクエスト
Androidのhttp postメソッドを介してjsonオブジェクトを送信
Androidでリクエストを介してJSONオブジェクトを送信する方法
私の現在のコードは:
FloatingActionButton btn_sendMsg = (FloatingActionButton) findViewById(R.id.btn_sendMsg);
btn_sendMsg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
/*Snackbar.make(view, "Sendevorgang...", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();*/
createMsg();
}
});
private void createMsg() {
Message message = new Message(txtbox_msg.getText().toString(), "testUser");
AsyncT asyncT = new AsyncT();
asyncT.execute(message);
}
AsyncT.Java:
@Override
protected Message doInBackground(Message... params) {
try {
URL url = new URL("http://[ip]:[port]"); //in the real code, there is an ip and a port
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("Accept","application/json");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.connect();
JSONObject jsonParam = new JSONObject();
jsonParam.put("uname", params[0].getUser());
jsonParam.put("message", params[0].getMessage());
jsonParam.put("latitude", "0");
jsonParam.put("longitude", "0");
jsonParam.put("id", "1");
DataOutputStream os = new DataOutputStream(conn.getOutputStream());
os.writeBytes(URLEncoder.encode(jsonParam.toString(), "UTF-8"));
os.flush();
os.close();
Log.i("STATUS", String.valueOf(conn.getResponseCode()));
Log.i("MSG" , conn.getResponseMessage());
conn.disconnect();
} catch (Exception e) {
}
return null;
}
エラーコードnetworkonmainthreadexception 500が発生します
どうすればこれを解決できますか?
解決済み:
かわった
os.writeBytes(URLEncoder.encode(jsonParam.toString(), "UTF-8"));
に
os.writeBytes(jsonParam.toString());
そして、コードをスレッドに入れます(@Ravi Sankerに感謝)
作業コード:
public void sendPost() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL(urlAdress);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
conn.setRequestProperty("Accept","application/json");
conn.setDoOutput(true);
conn.setDoInput(true);
JSONObject jsonParam = new JSONObject();
jsonParam.put("timestamp", 1488873360);
jsonParam.put("uname", message.getUser());
jsonParam.put("message", message.getMessage());
jsonParam.put("latitude", 0D);
jsonParam.put("longitude", 0D);
Log.i("JSON", jsonParam.toString());
DataOutputStream os = new DataOutputStream(conn.getOutputStream());
//os.writeBytes(URLEncoder.encode(jsonParam.toString(), "UTF-8"));
os.writeBytes(jsonParam.toString());
os.flush();
os.close();
Log.i("STATUS", String.valueOf(conn.getResponseCode()));
Log.i("MSG" , conn.getResponseMessage());
conn.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
}
CreateMsg()メソッドでこれを書いてみてください:
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
// The code written in doInBackground()
} catch (Exception e) {
e.printStackTrace();
}
}});
thread.start();
Networkonmainthread例外は、同じスレッドでネットワーク操作を実行すると発生します。ただし、非同期タスクを使用しているため、正常に機能するはずです。ただし、確認するだけです。