web-dev-qa-db-ja.com

Android POST JSONを使用したリクエスト

調査後も、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が発生します

どうすればこれを解決できますか?

10
Cihat

解決済み:

かわった

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();
}
26
Cihat

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例外は、同じスレッドでネットワーク操作を実行すると発生します。ただし、非同期タスクを使用しているため、正常に機能するはずです。ただし、確認するだけです。

4
Ravi Sanker