Android ile İstek üzerinden JSON nesnesi nasıl gönderilir?


115

Aşağıdaki JSON metnini göndermek istiyorum

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

bir web hizmetine gidin ve yanıtı okuyun. JSON'u nasıl okuyacağımı biliyorum. Sorun, yukarıdaki JSON nesnesinin bir değişken adı ile gönderilmesi gerektiğidir jason.

Bunu android üzerinden nasıl yapabilirim? İstek nesnesi oluşturma, içerik başlıklarını ayarlama vb. Adımlar nelerdir.

Yanıtlar:


97

Android'in HTTP göndermek ve almak için özel bir kodu yoktur, standart Java kodunu kullanabilirsiniz. Android ile birlikte gelen Apache HTTP istemcisini kullanmanızı tavsiye ederim. İşte bir HTTP POST göndermek için kullandığım bir kod parçası.

Nesneyi "jason" adlı bir değişkende göndermenin herhangi bir şeyle ne ilgisi olduğunu anlamıyorum. Sunucunun tam olarak ne istediğinden emin değilseniz, hangi formatta olması gerektiğini bilene kadar sunucuya çeşitli dizeler göndermek için bir test programı yazmayı düşünün.

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 bir JSON nesnesi mi?
AndroidDev

postMessagetanımlanmadı
Raptor

zaman aşımı ne için?
Lion789

ya birden fazla dizge geçerse? postMessage2.toString () gibi. getBytes ("UTF8")
Mayur R. Amipara

POJO'yu Json dizesine dönüştürmek için öneriler?
tgkprog

155

Apache HTTP İstemcisi kullanıyorsanız, Android'den bir json nesnesi göndermek kolaydır. İşte nasıl yapılacağına dair bir kod örneği. UI iş parçacığını kilitlememek için ağ etkinlikleri için yeni bir iş parçacığı oluşturmalısınız.

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

JSON göndermek ve almak için Google Gson'ı da kullanabilirsiniz .


Merhaba, sunucunun JSON olarak adlandırılan bir başlık ayarlamamı ve json içeriğini bu başlığa koymamı gerektirmesi mümkün olabilir mi? URL'yi HttpPost post = new HttpPost (" abc.com/xyz/usersgetuserdetails" ) olarak gönderiyorum ; Ama geçersiz istek hatası diyor. Kodun remiander'ı aynıdır. İkinci olarak json = header = new JSONObject (); Burada neler oluyor
AndroidDev

Sunucu tarafından ne tür bir istek beklendiğinden emin değilim. Buna gelince 'json = header = new JSONObject (); 'sadece 2 json nesnesi oluşturuyor.
Primal Pappachan

@primpop - Bununla birlikte gitmek için basit bir php betiği sağlama şansınız var mı? Kodunuzu uygulamayı denedim, ancak hayatım boyunca NULL dışında bir şey göndermesini sağlayamadım.
kubiej21

bu StringWriter writer = new StringWriter () gibi, inputsputstream'den (nesnenin içinde) çıktıyı alabilirsiniz; IOUtils.copy (içinde, yazar, "UTF-8"); String theString = writer.toString ();
Yekmer Şimşek

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

Json nesnesini ASP.Net mvc sunucusuna gönderdim. ASP.Net sunucusunda aynı json dizesini nasıl sorgulayabilirim?
Karthick

19

HttpPostAndroid Api Seviye 22 tarafından kullanımdan kaldırılmıştır. Bu nedenle, HttpUrlConnectiondaha fazlası için kullanı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;
}

1
Kabul edilen cevap değer kaybetti ve bu yaklaşım daha iyi
CoderBC

8

Aşağıdaki bağlantıda Android HTTP için şaşırtıcı derecede güzel bir kitaplık var:

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

Basit istekler çok kolaydır:

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

JSON göndermek için ( https://github.com/loopj/android-async-http/issues/125 adresinde `` voidberg '' e kredi verin ):

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

Tamamen eşzamansızdır, Android ile iyi çalışır ve kullanıcı arayüzü iş parçacığınızdan aramak güvenlidir. ResponseHandler, onu oluşturduğunuz iş parçacığı üzerinde çalışacaktır (tipik olarak, kullanıcı arabirimi iş parçacığınız). JSON için yerleşik bir resonseHandler bile var, ancak ben google gson kullanmayı tercih ediyorum.


Bunun çalıştığı minimum sdk'yi biliyor musunuz?
Esko918

GUI olmadığı için minimuma sahip olsaydı şaşırırdım. Neden deneyip bulgularınızı yayınlamıyorsunuz?
Alex

1
Bunun yerine yerel kütüphaneleri kullanmaya karar verdim. Bu konuda daha fazla bilgi var ve o zamandan beri android için oldukça yeniyim. Ben gerçekten bir iOS geliştiricisiyim. Başka birinin kodunu takıp oynamak yerine tüm dokümanları okuduğum için daha iyi. Yine de teşekkürler
Esko918

3

Artık HttpClient, kullanımdan kaldırıldığından, mevcut çalışma kodu, HttpUrlConnectionbağlantıyı oluşturmak ve bağlantıyı yazmak ve bağlantıdan okumak için kullanmaktır . Ama voleybolu kullanmayı tercih ettim . Bu kütüphane android AOSP'dandır. Kullanmayı çok kolay buldum JsonObjectRequestveyaJsonArrayRequest


2

Bundan daha basit hiçbir şey olamaz. OkHttpLibrary'yi kullanın

Json'unuzu oluşturun

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

ve böyle gönderin.

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

Kullanışlı bir kütüphane olan okhttp'yi gösterdiği için oy verildi, ancak verilen kod pek yardımcı olmuyor. Örneğin, RequestBody.create () öğesine iletilen argümanlar nelerdir? Daha fazla ayrıntı için bu bağlantıya bakın: 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();
        }
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.