Comment envoyer un objet JSON via Request avec Android?

115

Je souhaite envoyer le texte JSON suivant

{"Email":"[email protected]","Password":"123456"}

à un service Web et lisez la réponse. Je sais comment lire JSON. Le problème est que l'objet JSON ci-dessus doit être envoyé dans un nom de variable jason.

Comment puis-je faire cela depuis Android? Quelles sont les étapes telles que la création d'un objet de requête, la définition des en-têtes de contenu, etc.

AndroidDev
la source

Réponses:

97

Android n'a pas de code spécial pour l'envoi et la réception HTTP, vous pouvez utiliser du code Java standard. Je recommanderais d'utiliser le client HTTP Apache, fourni avec Android. Voici un extrait de code que j'ai utilisé pour envoyer un HTTP POST.

Je ne comprends pas ce que l'envoi de l'objet dans une variable nommée «jason» a à voir avec quoi que ce soit. Si vous n'êtes pas sûr de ce que veut exactement le serveur, envisagez d'écrire un programme de test pour envoyer diverses chaînes au serveur jusqu'à ce que vous sachiez dans quel format il doit être.

int TIMEOUT_MILLISEC = 10000;  // = 10 seconds
String postMessage="{}"; //HERE_YOUR_POST_STRING.
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT_MILLISEC);
HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC);
HttpClient client = new DefaultHttpClient(httpParams);

HttpPost request = new HttpPost(serverUrl);
request.setEntity(new ByteArrayEntity(
    postMessage.toString().getBytes("UTF8")));
HttpResponse response = client.execute(request);
dmazzoni
la source
21
PostMessage est-il un objet JSON?
AndroidDev
postMessagen'est pas défini
Raptor
quel est le délai d'expiration?
Lion789
et si vous passiez plus d'une chaîne? comme postMessage2.toString (). getBytes ("UTF8")
Mayur R. Amipara
Des suggestions pour convertir une chaîne POJO en chaîne Json?
tgkprog
155

L'envoi d'un objet json depuis Android est facile si vous utilisez Apache HTTP Client. Voici un exemple de code expliquant comment procéder. Vous devez créer un nouveau thread pour les activités réseau afin de ne pas verrouiller le thread d'interface utilisateur.

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

Vous pouvez également utiliser Google Gson pour envoyer et récupérer du JSON.

Primal Pappachan
la source
Salut, est-il possible que le serveur m'oblige à définir un en-tête appelé JSON et à mettre le contenu json dans cet en-tête? J'envoie l'url comme HttpPost post = new HttpPost (" abc.com/xyz/usersgetuserdetails" ); Mais c'est une erreur de demande invalide. Le rappel du code est le même. Deuxièmement, que fait json = header = new JSONObject (); Que se passe-t-il ici
AndroidDev
Je ne suis pas sûr du type de demande attendu par le serveur. Quant à cela 'json = header = new JSONObject (); 'il s'agit simplement de créer 2 objets json.
Primal Pappachan
@primpop - Y a-t-il une chance que vous soyez en mesure de fournir un script php simple pour accompagner cela? J'ai essayé d'implémenter votre code, mais pendant toute ma vie, je n'ai pas pu le faire envoyer autre chose que NULL.
kubiej21
vous pouvez obtenir la sortie de inputputstream (dans l'objet ici) sous forme de chaîne comme ceci StringWriter writer = new StringWriter (); IOUtils.copy (dans, écrivain, "UTF-8"); Chaîne theString = writer.toString ();
Yekmer Simsek
35
public void postData(String url,JSONObject obj) {
    // Create a new HttpClient and Post Header

    HttpParams myParams = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(myParams, 10000);
    HttpConnectionParams.setSoTimeout(myParams, 10000);
    HttpClient httpclient = new DefaultHttpClient(myParams );
    String json=obj.toString();

    try {

        HttpPost httppost = new HttpPost(url.toString());
        httppost.setHeader("Content-type", "application/json");

        StringEntity se = new StringEntity(obj.toString()); 
        se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
        httppost.setEntity(se); 

        HttpResponse response = httpclient.execute(httppost);
        String temp = EntityUtils.toString(response.getEntity());
        Log.i("tag", temp);


    } catch (ClientProtocolException e) {

    } catch (IOException e) {
    }
}
Sachin Gurnani
la source
J'ai posté l'objet json sur le serveur mvc ASP.Net. Comment puis-je interroger la même chaîne json dans le serveur ASP.Net.?
Karthick
19

HttpPostest obsolète par Android Api Level 22. Alors, utilisez HttpUrlConnectionpour plus loin.

public static String makeRequest(String uri, String json) {
    HttpURLConnection urlConnection;
    String url;
    String data = json;
    String result = null;
    try {
        //Connect 
        urlConnection = (HttpURLConnection) ((new URL(uri).openConnection()));
        urlConnection.setDoOutput(true);
        urlConnection.setRequestProperty("Content-Type", "application/json");
        urlConnection.setRequestProperty("Accept", "application/json");
        urlConnection.setRequestMethod("POST");
        urlConnection.connect();

        //Write
        OutputStream outputStream = urlConnection.getOutputStream();
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
        writer.write(data);
        writer.close();
        outputStream.close();

        //Read
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));

        String line = null;
        StringBuilder sb = new StringBuilder();

        while ((line = bufferedReader.readLine()) != null) {
            sb.append(line);
        }

        bufferedReader.close();
        result = sb.toString();

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return result;
}
Vikoo
la source
1
La réponse acceptée est dépréciée et cette approche est meilleure
CoderBC
8

Il existe une bibliothèque étonnamment agréable pour Android HTTP disponible sur le lien ci-dessous:

http://loopj.com/android-async-http/

Les demandes simples sont très faciles:

AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {
    @Override
    public void onSuccess(String response) {
        System.out.println(response);
    }
});

Pour envoyer JSON (crédit à `voidberg 'sur https://github.com/loopj/android-async-http/issues/125 ):

// params is a JSONObject
StringEntity se = null;
try {
    se = new StringEntity(params.toString());
} catch (UnsupportedEncodingException e) {
    // handle exceptions properly!
}
se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));

client.post(null, "www.example.com/objects", se, "application/json", responseHandler);

Tout est asynchrone, fonctionne bien avec Android et peut être appelé en toute sécurité depuis votre thread d'interface utilisateur. Le responseHandler s'exécutera sur le même thread à partir duquel vous l'avez créé (généralement, votre thread d'interface utilisateur). Il a même un resonseHandler intégré pour JSON, mais je préfère utiliser google gson.

Alex
la source
Connaissez-vous le SDK minimum sur lequel cela fonctionne?
Esko918
Je serais surpris s'il y avait un minimum car ce n'est pas une interface graphique. Pourquoi ne pas l'essayer et publier vos résultats.
Alex
1
Eh bien, j'ai décidé d'utiliser les bibliothèques natives à la place. Theres plus d'informations à ce sujet et depuis je suis assez nouveau sur Android. Je suis vraiment un développeur iOS. C'est mieux depuis que je lis tous les documents au lieu de simplement brancher et jouer avec le code de quelqu'un d'autre. Merci bien
Esko918
3

Maintenant que le HttpClientest obsolète, le code de travail actuel consiste à utiliser le HttpUrlConnectionpour créer la connexion et écrire et lire à partir de la connexion. Mais j'ai préféré utiliser le Volley . Cette bibliothèque provient d'Android AOSP. J'ai trouvé très facile à utiliser à faire JsonObjectRequestouJsonArrayRequest

Sanjeet A
la source
2

Rien de plus simple que cela. Utilisez OkHttpLibrary

Créez votre json

JSONObject requestObject = new JSONObject();
requestObject.put("Email", email);
requestObject.put("Password", password);

et envoyez-le comme ça.

OkHttpClient client = new OkHttpClient();

RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
            .addHeader("Content-Type","application/json")
            .url(url)
            .post(requestObject.toString())
            .build();

okhttp3.Response response = client.newCall(request).execute();
Dave Ranjan
la source
Voté pour avoir pointé vers okhttp, qui est une bibliothèque utile, mais le code tel qu'il est donné n'aide pas beaucoup. Par exemple, quels sont les arguments passés à RequestBody.create ()? Voir ce lien pour plus de détails: vogella.com/tutorials/JavaLibrary-OkHttp/article.html
Dabbler
0
public class getUserProfile extends AsyncTask<Void, String, JSONArray> {
    JSONArray array;
    @Override
    protected JSONArray doInBackground(Void... params) {

        try {
            commonurl cu = new commonurl();
            String u = cu.geturl("tempshowusermain.php");
            URL url =new URL(u);
          //  URL url = new URL("http://192.168.225.35/jabber/tempshowusermain.php");
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setRequestProperty("Content-Type", "application/json");
            httpURLConnection.setRequestProperty("Accept", "application/json");
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setRequestProperty("Connection", "Keep-Alive");
            httpURLConnection.setDoInput(true);
            httpURLConnection.connect();

            JSONObject jsonObject=new JSONObject();
            jsonObject.put("lid",lid);


            DataOutputStream outputStream = new DataOutputStream(httpURLConnection.getOutputStream());
            outputStream.write(jsonObject.toString().getBytes("UTF-8"));

            int code = httpURLConnection.getResponseCode();
            if (code == 200) {
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));

                StringBuffer stringBuffer = new StringBuffer();
                String line;

                while ((line = bufferedReader.readLine()) != null) {
                    stringBuffer.append(line);
                }
                object =  new JSONObject(stringBuffer.toString());
             //   array = new JSONArray(stringBuffer.toString());
                array = object.getJSONArray("response");

            }

        } catch (Exception e) {

            e.printStackTrace();
        }
        return array;


    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();



    }

    @Override
    protected void onPostExecute(JSONArray array) {
        super.onPostExecute(array);
        try {
            for (int x = 0; x < array.length(); x++) {

                object = array.getJSONObject(x);
                ComonUserView commUserView=new ComonUserView();//  commonclass.setId(Integer.parseInt(jsonObject2.getString("pid").toString()));
                //pidArray.add(jsonObject2.getString("pid").toString());

                commUserView.setLid(object.get("lid").toString());
                commUserView.setUname(object.get("uname").toString());
                commUserView.setAboutme(object.get("aboutme").toString());
                commUserView.setHeight(object.get("height").toString());
                commUserView.setAge(object.get("age").toString());
                commUserView.setWeight(object.get("weight").toString());
                commUserView.setBodytype(object.get("bodytype").toString());
                commUserView.setRelationshipstatus(object.get("relationshipstatus").toString());
                commUserView.setImagepath(object.get("imagepath").toString());
                commUserView.setDistance(object.get("distance").toString());
                commUserView.setLookingfor(object.get("lookingfor").toString());
                commUserView.setStatus(object.get("status").toString());

                cm.add(commUserView);
            }
            custuserprof = new customadapterformainprofile(getActivity(),cm,Tab3.this);
          gridusername.setAdapter(custuserprof);
            //  listusername.setAdapter(custuserprof);
            } catch (Exception e) {

                e.printStackTrace();
        }
    }
Niral Dharmnathi
la source