¿Cómo enviar un objeto JSON a través de una solicitud con Android?

115

Quiero enviar el siguiente texto JSON

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

a un servicio web y lea la respuesta. Sé leer JSON. El problema es que el objeto JSON anterior debe enviarse con un nombre de variable jason.

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

AndroidDev
fuente

Respuestas:

97

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

No entiendo qué tiene que ver enviar el objeto en una variable llamada "jason" con nada. Si no está seguro de qué quiere exactamente el servidor, considere escribir un programa 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);
dmazzoni
fuente
21
¿PostMessage es un objeto JSON?
AndroidDev
postMessageno está definido
Raptor
para que es el tiempo de espera
Lion789
¿y si pasa más de una cuerda? como postMessage2.toString (). getBytes ("UTF8")
Mayur R. Amipara
¿Sugerencias para convertir una cadena POJO a Json?
tgkprog
155

Enviar un objeto json desde Android es fácil si usa Apache HTTP Client. Aquí hay una muestra de código sobre cómo hacerlo. Debe crear un nuevo hilo para las actividades de la 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.

Pappachan primigenio
fuente
Hola, ¿podría ser posible que el servidor requiera que configure un encabezado llamado JSON y coloque el contenido json en ese encabezado? Envío la url como HttpPost post = new HttpPost (" abc.com/xyz/usersgetuserdetails" ); Pero está diciendo error de solicitud no válida. El resto del código es el mismo. En segundo lugar, ¿qué hace json = header = new JSONObject (); ¿Qué está pasando aquí?
AndroidDev
No estoy seguro de qué tipo de solicitud espera el servidor. En cuanto a esto 'json = header = new JSONObject (); 'solo está creando 2 objetos json.
Primal Pappachan
@primpop - ¿Existe alguna posibilidad de que pueda proporcionar un script php simple para acompañar esto? Intenté implementar su código, pero por mi vida no pude conseguir que envíe nada más que NULL.
kubiej21
puede obtener la salida de inputputstream (en el objeto aquí) como una cadena como esta StringWriter writer = new StringWriter (); IOUtils.copy (en, escritor, "UTF-8"); String 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
fuente
He publicado el objeto json en el servidor ASP.Net mvc. ¿Cómo puedo consultar la misma cadena json en el servidor ASP.Net?
Karthick
19

HttpPostestá obsoleto por el nivel 22 de Android Api. Por lo tanto, use HttpUrlConnectionpara más.

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
fuente
1
La respuesta aceptada se deprecia y este enfoque es mejor
CoderBC
8

Hay una biblioteca sorprendentemente agradable para HTTP de Android 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);

Todo es asincrónico, funciona bien con Android y es seguro llamarlo desde el hilo de la interfaz de usuario. ResponseHandler se ejecutará en el mismo hilo desde el que lo creó (normalmente, su hilo de IU). Incluso tiene un resonseHandler incorporado para JSON, pero prefiero usar google gson.

Alex
fuente
¿Conoce el sdk mínimo en el que se ejecuta?
Esko918
Me sorprendería si tuviera un mínimo, ya que no es GUI. ¿Por qué no probarlo y publicar sus hallazgos?
Alex
1
Bueno, decidí usar las bibliotecas nativas en su lugar. Hay más información sobre eso y como soy bastante nuevo en Android. Realmente soy un desarrollador de iOS. Es mejor ya que estoy leyendo todos los documentos en lugar de simplemente conectar y jugar con el código de otra persona. Sin embargo, gracias
Esko918
3

Ahora, dado que HttpClientestá en desuso, el código de trabajo actual es usar HttpUrlConnectionpara crear la conexión y escribir y leer desde la conexión. Pero preferí usar el Volley . Esta biblioteca es de Android AOSP. Encontré muy fácil de usar para hacer JsonObjectRequestoJsonArrayRequest

Sanjeet A
fuente
2

Nada puede ser más simple que esto. Utilice OkHttpLibrary

Crea tu json

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

y envíalo 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();
Dave Ranjan
fuente
Upvoted por apuntar a okhttp, que es una biblioteca útil, pero el código dado no ayuda mucho. Por ejemplo, ¿cuáles son los argumentos que se pasan a RequestBody.create ()? Consulte este enlace para obtener más detalles: 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
fuente