Après des recherches, je ne peux toujours pas envoyer une requête JSON POST à un serveur.
J'ai déjà essayé des réponses plus anciennes:
Java - envoi de paramètres HTTP via POST facilement
[Android] -POST Json avec HttpUrlConnection
Publier la demande d'enregistrement des données utilisateur sur le serveur par HttpUrlConnection
Envoi d'un objet json via la méthode de publication http dans Android
Comment envoyer un objet JSON via Request avec Android?
Mon code actuel est:
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;
}
Je reçois le code d'erreur networkonmainthreadexception 500
Comment puis-je resoudre ceci?
Résolu:
modifié
os.writeBytes(URLEncoder.encode(jsonParam.toString(), "UTF-8"));
à
os.writeBytes(jsonParam.toString());
Et mettre le code dans un fil (grâce à @Ravi Sanker)
Code de travail:
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();
}
Pouvez-vous essayer d'écrire ceci dans la méthode createMsg ():
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
// The code written in doInBackground()
} catch (Exception e) {
e.printStackTrace();
}
}});
thread.start();
L'exception networkonmainthread survient lorsque vous exécutez les opérations réseau sur le même thread. Mais, puisque vous utilisez une tâche asynchrone, cela devrait fonctionner correctement. Mais, juste pour confirmer.