¿Cómo enviar un objeto JSON por solicitud con Android?

Deseo enviar el siguiente texto JSON {"Email":"aaa@tbbb.com","Password":"123456"} a un servicio web y leer la respuesta. Sé cómo leer JSON . El problema es que el objeto JSON anterior debe enviarse con el nombre de la variable jason .

¿Cómo puedo hacer esto desde Android? ¿Cuáles son los pasos como crear objeto de solicitud, establecer encabezados de contenido, etc.

Android no tiene un código especial para enviar y recibir HTTP, puede usar el código Java estándar. Recomiendo usar el cliente Apache HTTP, que viene con Android. Aquí hay un fragmento de código que solía enviar un HTTP POST.

No entiendo qué tiene que ver el envío del objeto en una variable llamada “jason”. Si no está seguro de lo que exactamente quiere el servidor, considere escribir un progtwig de prueba para enviar varias cadenas al servidor hasta que sepa en qué formato debe estar.

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

Enviar un objeto json desde Android es fácil si utiliza Apache HTTP Client. Aquí hay un ejemplo de código sobre cómo hacerlo. Debería crear un nuevo hilo para actividades de red para no bloquear el hilo de la interfaz de usuario.

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

También puede usar Google Gson para enviar y recuperar JSON.

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

HttpPost está desaprobado por Android Api Level 22. Por lo tanto, use HttpUrlConnection para más información.

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

Hay una biblioteca sorprendentemente agradable para Android HTTP disponible en el siguiente enlace:

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

Las solicitudes simples son muy fáciles:

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

Para enviar JSON (crédito a `voidberg ‘en 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); 

Es todo asíncrono, funciona bien con Android y es seguro llamar desde tu hilo de interfaz de usuario. El responseHandler se ejecutará en el mismo hilo desde el que lo creó (normalmente, su subproceso de interfaz de usuario). Incluso tiene un resonseHandler incorporado para JSON, pero yo prefiero usar google gson.

Ahora que el HttpClient está en desuso, el código de trabajo actual es usar HttpUrlConnection para crear la conexión y escribir y leer de la conexión. Pero preferí usar el Volley . Esta biblioteca es de Android AOSP. Me pareció muy fácil de usar para hacer JsonObjectRequest o JsonArrayRequest

Nada podría ser tan simple como esto. Use OkHttpLibrary

Crea tu json

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

y enviarlo así

 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(); 
 public class getUserProfile extends AsyncTask { 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(); } }