web-dev-qa-db-fra.com

Comment envoyer un objet json au serveur depuis mon application Android

Je ne sais trop comment envoyer un jsonobject 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;


    }


}
7
Tfish

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.

12
Tom Alabaster

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.

  1. Créez une classe Asynctask et substituez toutes les méthodes nécessaires.
  2. La méthode sendDeviceDetails ira finalement dans la méthode doInBackgound
  3. 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.

1
Parth Doshi

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. 

0
Parsania Hardik