Je ne sais trop comment envoyer un json
object depuis mon application Android vers la base de données.
Comme je suis nouveau dans ce domaine, je ne sais pas trop où je me suis trompé, j'ai extrait les données de la variable XML
et je ne sais pas comment envoyer ensuite l'objet à notre serveur.
tout conseil serait vraiment apprécié
package mmu.tom.linkedviewproject;
import Android.content.Intent;
import Android.os.Bundle;
import Android.support.v7.app.AppCompatActivity;
import Android.util.Log;
import Android.view.View;
import Android.widget.Button;
import Android.widget.EditText;
import Android.widget.ImageButton;
import org.Apache.http.HttpEntity;
import org.Apache.http.HttpResponse;
import org.Apache.http.client.ClientProtocolException;
import org.Apache.http.client.methods.HttpGet;
import org.Apache.http.impl.client.DefaultHttpClient;
import org.Apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import Java.io.IOException;
/**
* Created by Tom on 12/02/2016.
*/
public class DeviceDetailsActivity extends AppCompatActivity {
private EditText address;
private EditText name;
private EditText manufacturer;
private EditText location;
private EditText type;
private EditText deviceID;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_device_details);
ImageButton button1 = (ImageButton) findViewById(R.id.image_button_back);
button1.setOnClickListener(new View.OnClickListener() {
Class ourClass;
public void onClick(View v) {
Intent intent = new Intent(DeviceDetailsActivity.this, MainActivity.class);
startActivity(intent);
}
});
Button submitButton = (Button) findViewById(R.id.submit_button);
submitButton.setOnClickListener(new View.OnClickListener() {
Class ourClass;
public void onClick(View v) {
sendDeviceDetails();
}
});
setContentView(R.layout.activity_device_details);
this.address = (EditText) this.findViewById(R.id.edit_address);
this.name = (EditText) this.findViewById(R.id.edit_name);
this.manufacturer = (EditText) this.findViewById(R.id.edit_manufacturer);
this.location = (EditText) this.findViewById(R.id.edit_location);
this.type = (EditText) this.findViewById(R.id.edit_type);
this.deviceID = (EditText) this.findViewById(R.id.edit_device_id);
}
protected void onPostExecute(JSONArray jsonArray) {
try
{
JSONObject device = jsonArray.getJSONObject(0);
name.setText(device.getString("name"));
address.setText(device.getString("address"));
location.setText(device.getString("location"));
manufacturer.setText(device.getString("manufacturer"));
type.setText(device.getString("type"));
}
catch(Exception e){
e.printStackTrace();
}
}
public JSONArray sendDeviceDetails() {
// URL for getting all customers
String url = "http://52.88.194.67:8080/IOTProjectServer/registerDevice?";
// Get HttpResponse Object from url.
// Get HttpEntity from Http Response Object
HttpEntity httpEntity = null;
try {
DefaultHttpClient httpClient = new DefaultHttpClient(); // Default HttpClient
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(httpGet);
httpEntity = httpResponse.getEntity();
} catch (ClientProtocolException e) {
// Signals error in http protocol
e.printStackTrace();
//Log Errors Here
} catch (IOException e) {
e.printStackTrace();
}
// Convert HttpEntity into JSON Array
JSONArray jsonArray = null;
if (httpEntity != null) {
try {
String entityResponse = EntityUtils.toString(httpEntity);
Log.e("Entity Response : ", entityResponse);
jsonArray = new JSONArray(entityResponse);
} catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return jsonArray;
}
}
Vous devez utiliser une classe AsyncTask
pour communiquer avec votre serveur. Quelque chose comme ça:
Ceci est dans votre méthode onCreate
.
Button submitButton = (Button) findViewById(R.id.submit_button);
submitButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
JSONObject postData = new JSONObject();
try {
postData.put("name", name.getText().toString());
postData.put("address", address.getText().toString());
postData.put("manufacturer", manufacturer.getText().toString());
postData.put("location", location.getText().toString());
postData.put("type", type.getText().toString());
postData.put("deviceID", deviceID.getText().toString());
new SendDeviceDetails().execute("http://52.88.194.67:8080/IOTProjectServer/registerDevice", postData.toString());
} catch (JSONException e) {
e.printStackTrace();
}
}
});
Ceci est une nouvelle classe au sein de votre classe d'activité.
private class SendDeviceDetails 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); // this is expecting a response code to be sent from your server upon receiving the POST data
}
}
La ligne: httpURLConnection.setRequestMethod("POST");
en fait une demande HTTP POST et doit être traitée comme une demande POST sur votre serveur.
Ensuite, sur votre serveur, vous devrez créer un nouvel objet JSON à partir du "PostData" envoyé dans la requête HTTP POST. Si vous nous indiquez la langue que vous utilisez sur votre serveur, nous pourrons écrire du code pour vous.
Selon votre implémentation de code actuelle, vous avez la méthode onPostExecute
mais il n’existe pas de méthodes onPreExecute
et doInBackgound
. À partir d'Android 3.0, toutes les opérations réseau doivent être effectuées sur le thread d'arrière-plan. Vous devez donc utiliser Asynctask
qui effectuera l'envoi effectif de la demande en arrière-plan et dans la onPostExecute
gérer le résultat renvoyé par la méthode doInbackground
.
Voici ce que tu dois faire.
sendDeviceDetails
ira finalement dans la méthode doInBackgound
. onPostExecute
gérera le résultat renvoyé.En ce qui concerne l’envoi d’un objet JSON
, vous pouvez le faire comme suit:
Extrait de code emprunté à ici
protected void sendJson(final String email, final String pwd) {
Thread t = new Thread() {
public void run() {
Looper.prepare(); //For Preparing Message Pool for the child Thread
HttpClient client = new DefaultHttpClient();
HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); //Timeout Limit
HttpResponse response;
JSONObject json = new JSONObject();
try {
HttpPost post = new HttpPost(URL);
json.put("email", email);
json.put("password", pwd);
StringEntity se = new StringEntity( json.toString());
se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
post.setEntity(se);
response = client.execute(post);
/*Checking response */
if(response!=null){
InputStream in = response.getEntity().getContent(); //Get the data in the entity
}
} catch(Exception e) {
e.printStackTrace();
createDialog("Error", "Cannot Estabilish Connection");
}
Looper.loop(); //Loop in the message queue
}
};
t.start();
}
Ceci est juste un des moyens. Vous pouvez également opter pour une implémentation Asynctask
.
Vous devez utiliser le service Web pour envoyer des données de votre application à votre serveur, car cela facilitera votre travail. Pour cela, vous devez créer un service Web dans n’importe quel langage côté serveur comme php, .net ou même vous pouvez utiliser jsp (page du serveur Java).
Vous devez transmettre tous les éléments de vos Edittexts au service Web. Le travail d’ajout de données au serveur sera traité par le service Web.