Come inviare un oggetto JSON su richiesta con Android?


115

Voglio inviare il seguente testo JSON

{"Email":"aaa@tbbb.com","Password":"123456"}

a un servizio Web e leggere la risposta. So come leggere JSON. Il problema è che l'oggetto JSON precedente deve essere inviato con un nome di variabilejason .

Come posso farlo da Android? Quali sono i passaggi come la creazione di un oggetto richiesta, l'impostazione delle intestazioni di contenuto, ecc.

Risposte:


97

Android non ha un codice speciale per l'invio e la ricezione di HTTP, puoi utilizzare il codice Java standard. Consiglierei di utilizzare il client HTTP Apache, fornito con Android. Ecco uno snippet di codice che ho usato per inviare un POST HTTP.

Non capisco cosa abbia a che fare con l'invio dell'oggetto in una variabile chiamata "jason". Se non sei sicuro di cosa voglia esattamente il server, prendi in considerazione la possibilità di scrivere un programma di test per inviare varie stringhe al server fino a quando non sai in quale formato deve essere.

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
PostMessage è un oggetto JSON?
AndroidDev

postMessagenon è definito
Raptor

a cosa serve il timeout?
Lion789

cosa succede se si passa più di una stringa? come postMessage2.toString (). getBytes ("UTF8")
Mayur R. Amipara

Suggerimenti per convertire un POJO in una stringa Json?
tgkprog

155

L'invio di un oggetto json da Android è facile se utilizzi il client HTTP Apache. Ecco un esempio di codice su come farlo. È necessario creare un nuovo thread per le attività di rete in modo da non bloccare il thread dell'interfaccia utente.

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

Puoi anche utilizzare Google Gson per inviare e recuperare JSON.


Salve, potrebbe essere possibile che il server mi richieda di impostare un'intestazione chiamata JSON e inserire il contenuto json in quell'intestazione? Invio l'URL come HttpPost post = new HttpPost (" abc.com/xyz/usersgetuserdetails" ); Ma sta dicendo errore di richiesta non valida. Il rimedio del codice è lo stesso. In secondo luogo cosa fa json = header = new JSONObject (); Cosa sta succedendo qui
AndroidDev

Non sono sicuro del tipo di richiesta previsto dal server. Per quanto riguarda questo 'json = header = new JSONObject (); 'sta solo creando 2 oggetti json.
Primal Pappachan

@primpop - C'è qualche possibilità che tu possa fornire un semplice script php per andare avanti con questo? Ho provato ad implementare il tuo codice, ma per tutta la vita non sono riuscito a convincerlo a inviare altro che NULL.
kubiej21

puoi ottenere l'output da inputputstream (nell'oggetto qui) come stringa come questa StringWriter writer = new StringWriter (); IOUtils.copy (in, writer, "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) {
    }
}

Ho inviato l'oggetto JSON al server ASP.Net mvc. Come posso interrogare la stessa stringa json nel server ASP.Net.?
Karthick

19

HttpPostè deprecato da Android Api livello 22. Quindi, usa HttpUrlConnectionper ulteriori.

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 risposta accettata è svalutata e questo approccio è migliore
CoderBC

8

C'è una libreria sorprendentemente bella per Android HTTP disponibile al link sottostante:

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

Le richieste semplici sono molto facili:

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

Per inviare JSON (credito a "voidberg" su 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);

È tutto asincrono, funziona bene con Android e può essere chiamato in sicurezza dal thread dell'interfaccia utente. Il responseHandler verrà eseguito sullo stesso thread da cui è stato creato (in genere, il thread dell'interfaccia utente). Ha anche un resonseHandler integrato per JSON, ma preferisco usare google gson.


Conosci l'SDK minimo su cui funziona?
Esko918

Sarei sorpreso se avesse un minimo poiché non è GUI. Perché non provarlo e pubblicare i tuoi risultati.
Alex

1
Bene, ho deciso di utilizzare invece le librerie native. Ci sono più informazioni al riguardo e dato che sono abbastanza nuovo su Android. Sono davvero uno sviluppatore iOS. È meglio dato che sto leggendo tutti i documenti invece di collegare e giocare con il codice di qualcun altro. Grazie comunque
Esko918

3

Ora, poiché HttpClientè deprecato, il codice corrente è quello di utilizzare HttpUrlConnectionper creare la connessione e scrivere e leggere dalla connessione. Ma ho preferito usare il Volley . Questa libreria proviene da Android AOSP. Ho trovato molto facile da usare per creare JsonObjectRequestoJsonArrayRequest


2

Niente potrebbe essere semplice di questo. Usa OkHttpLibrary

Crea il tuo json

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

e invialo in questo modo.

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

Votato per indicare okhttp, che è una libreria utile, ma il codice fornito non aiuta molto. Ad esempio, quali sono gli argomenti passati a RequestBody.create ()? Vedi questo link per maggiori dettagli: 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();
        }
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.