2010-06-12 4 views
112

Je veux envoyer le texte JSON suivant {"Email":"[email protected]","Password":"123456"} à un service Web et lire la réponse. Je sais à comment lire JSON. Le problème est que l'objet JSON ci-dessus doit être envoyé sous un nom de variable jason.Comment envoyer un objet JSON via une requête avec Android?

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

Répondre

97

Android ne possède pas de code spécial pour l'envoi et la réception HTTP, vous pouvez utiliser le code Java standard. Je recommande d'utiliser le client HTTP Apache, qui est livré avec Android. Voici un extrait de code que j'ai utilisé pour envoyer un POST HTTP.

Je ne comprends pas ce que l'envoi de l'objet dans une variable nommée "jason" a à voir avec n'importe quoi. Si vous n'êtes pas sûr exactement le serveur veut, envisager d'écrire un programme de test pour envoyer des différentes chaînes sur le serveur jusqu'à ce que vous savez 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); 
+21

Est-postMessage un objet JSON? – AndroidDev

+1

Le travail est comme de la magie! –

+0

'postMessage' n'est pas défini – Raptor

155

Envoi d'un objet JSON d'Android est facile si vous utilisez le client HTTP Apache. Voici un exemple de code sur la façon de le faire. 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 JSON.

+0

Salut pourrait-il être possible que le serveur me demande de définir un en-tête JSON calé et mettre le contenu json dans cet en-tête? J'ai envoyé l'url comme HttpPost post = new HttpPost ("http://www.abc.com/xyz/usersgetuserdetails ");.. Mais son DISENT erreur de requête invalide le remiander du code est le même en second lieu qu'est-ce que JSON = tête = new JSONObject(); ce qui est passe ici – AndroidDev

+0

Je ne suis pas sûr En ce qui concerne ce 'json = header = new JSONObject();', il crée simplement 2 objets json – primpap

+0

@primpop - Y at-il une chance que vous puissiez fournir un simple script php? pour aller avec ça? J'ai essayé d'implémenter votre code, mais moi pour la vie de ne l'obtiens pas pour envoyer autre chose que NULL. – kubiej21

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) { 
    } 
} 
+0

J'ai posté l'objet json au serveur mvc ASP.Net. Comment puis-je interroger la même chaîne JSON dans le serveur ASP.Net? – Karthick

8

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

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

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 'au 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é depuis votre thread d'interface utilisateur. Le responseHandler s'exécutera sur le même thread que vous l'avez créé (généralement, votre thread UI). Il a même une réponse intégrée pour JSON, mais je préfère utiliser google gson.

+0

Connaissez-vous le minimum sdk cela fonctionne? – Esko918

+0

Je serais surpris s'il y avait un minimum car ce n'est pas une interface graphique. Pourquoi ne pas essayer et poster vos conclusions. – 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 pour android. Im vraiment un dev iOS. C'est mieux depuis que je lis sur tous les docs au lieu de simplement brancher et jouer avec quelqu'un d'autre code. Merci bien – Esko918

17

HttpPost est obsolète par Android Api niveau 22. Donc, utilisez HttpUrlConnection pour 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; 
} 
+1

La réponse acceptée est dépréciée et cette approche est meilleure – CoderBC

3

maintenant depuis le HttpClient est dépréciée le code de travail actuel est d'utiliser le HttpUrlConnection pour créer la connexion et écrire le 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 pour faire JsonObjectRequest ou JsonArrayRequest

1

Rien de plus simple que cela. Utilisez OkHttpLibrary

Créer votre JSON

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

et l'envoyer 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(); 
+0

Upvoted pour pointer sur okhttp, qui est une bibliothèque utile, mais le code tel que donné n'aide pas beaucoup. Par exemple, quels sont les arguments passés à RequestBody.create()? Voir ce lien pour plus de détails: http://www.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(); 
     } 
    } 
+0

Veuillez expliquer brièvement votre code –

Questions connexes