Bagaimana cara mengirim objek JSON melalui Request dengan Android?

115

Saya ingin mengirim teks JSON berikut

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

ke layanan web dan baca tanggapannya. Saya tahu cara membaca JSON. Masalahnya adalah objek JSON di atas harus dikirim dalam nama variabel jason.

Bagaimana saya bisa melakukan ini dari android? Apa saja langkah-langkahnya seperti membuat objek permintaan, mengatur header konten, dll.

AndroidDev
sumber

Jawaban:

97

Android tidak memiliki kode khusus untuk mengirim dan menerima HTTP, Anda dapat menggunakan kode Java standar. Saya akan merekomendasikan menggunakan klien HTTP Apache, yang hadir dengan Android. Berikut potongan kode yang saya gunakan untuk mengirim HTTP POST.

Saya tidak mengerti apa hubungannya mengirim objek dalam variabel bernama "jason" dengan apa pun. Jika Anda tidak yakin apa yang diinginkan server, pertimbangkan untuk menulis program pengujian untuk mengirim berbagai string ke server sampai Anda tahu format apa yang dibutuhkannya.

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.dll
sumber
21
Apakah postMessage merupakan objek JSON?
AndroidDev
postMessagetidak ditentukan
Raptor
untuk apa batas waktu itu?
Lion789
bagaimana jika melewatkan lebih dari satu string? seperti postMessage2.toString (). getBytes ("UTF8")
Mayur R. Amipara
Saran untuk mengubah string POJO ke Json?
tgkprog
155

Mengirim objek json dari Android itu mudah jika Anda menggunakan Apache HTTP Client. Berikut adalah contoh kode tentang cara melakukannya. Anda harus membuat thread baru untuk aktivitas jaringan agar tidak mengunci thread UI.

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

Anda juga dapat menggunakan Google Gson untuk mengirim dan mengambil JSON.

Primal Pappachan
sumber
Hai, mungkinkah server meminta saya menyetel header caled JSON dan meletakkan konten json di header itu? Saya mengirimkan url sebagai HttpPost post = new HttpPost (" abc.com/xyz/usersgetuserdetails" ); Tapi itu mengatakan kesalahan permintaan tidak valid. Sisa kodenya sama. Kedua, apa json = header = new JSONObject (); Apa yang terjadi di sini
AndroidDev
Saya tidak yakin permintaan seperti apa yang diharapkan oleh server. Adapun ini 'json = header = new JSONObject (); 'itu hanya membuat 2 objek json.
Primal Pappachan
@primpop - Adakah kemungkinan Anda dapat memberikan skrip php sederhana untuk digunakan bersama ini? Saya mencoba menerapkan kode Anda, tetapi seumur hidup saya tidak bisa mengirimnya selain NULL.
kubiej21
Anda bisa mendapatkan output dari inputsputstream (dalam objek di sini) sebagai string seperti ini Penulis StringWriter = new StringWriter (); IOUtils.copy (dalam, penulis, "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
sumber
Saya telah memposting objek json ke server MVC ASP.Net. Bagaimana saya bisa menanyakan string json yang sama di server ASP.Net.?
Karthick
19

HttpPosttidak digunakan lagi oleh Android Api Level 22. Jadi, Gunakan HttpUrlConnectionuntuk lebih lanjut.

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
sumber
1
Jawaban yang diterima disusutkan dan pendekatan ini lebih baik
CoderBC
8

Ada pustaka yang sangat bagus untuk HTTP Android yang tersedia di tautan di bawah ini:

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

Permintaan sederhana sangat mudah:

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

Untuk mengirim JSON (kredit ke `voidberg 'di 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);

Semuanya asinkron, bekerja dengan baik dengan Android dan aman untuk dipanggil dari UI thread Anda. ResponseHandler akan berjalan di utas yang sama dengan tempat Anda membuatnya (biasanya, utas UI Anda). Ia bahkan memiliki resonseHandler bawaan untuk JSON, tetapi saya lebih suka menggunakan google gson.

Alex
sumber
Apakah Anda tahu sdk minimum tempat ini dijalankan?
Esko918
Saya akan terkejut jika minimumnya karena itu bukan GUI. Mengapa tidak mencobanya dan memposting temuan Anda.
Alex
1
Saya memutuskan untuk menggunakan perpustakaan asli sebagai gantinya. Ada lebih banyak informasi tentang itu dan karena saya cukup baru mengenal android. Saya benar-benar seorang pengembang iOS. Lebih baik karena saya membaca semua dokumen daripada hanya memasukkan dan bermain dengan kode orang lain. Terima kasih meskipun
Esko918
3

Sekarang karena HttpClientsudah tidak digunakan lagi, kode yang berfungsi saat ini adalah menggunakan HttpUrlConnectionuntuk membuat koneksi dan menulis dan membaca dari koneksi. Tapi saya lebih suka menggunakan Volley . Perpustakaan ini dari android AOSP. Saya menemukan sangat mudah digunakan untuk membuat JsonObjectRequestatauJsonArrayRequest

Sanjeet A
sumber
2

Tidak ada yang lebih sederhana dari ini. Gunakan OkHttpLibrary

Buat json Anda

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

dan mengirimkannya seperti ini.

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
sumber
Suara positif untuk menunjuk ke okhttp, yang merupakan pustaka yang berguna, tetapi kode yang diberikan tidak banyak membantu. Misalnya, argumen apa yang diteruskan ke RequestBody.create ()? Lihat tautan ini untuk detail selengkapnya: 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
sumber