Android के साथ अनुरोध पर JSON ऑब्जेक्ट कैसे भेजें?


115

मैं निम्नलिखित JSON टेक्स्ट भेजना चाहता हूं

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

एक वेब सेवा के लिए और प्रतिक्रिया पढ़ें। मुझे पता है कि JSON कैसे पढ़ें। समस्या यह है कि उपरोक्त JSON ऑब्जेक्ट को एक चर नाम में भेजा जाना चाहिएjason

मैं इसे एंड्रॉइड से कैसे कर सकता हूं? रिक्वेस्ट ऑब्जेक्ट बनाने, कंटेंट हेडर सेट करने आदि जैसे कदम क्या हैं।

जवाबों:


97

Android के पास HTTP भेजने और प्राप्त करने के लिए विशेष कोड नहीं है, आप मानक जावा कोड का उपयोग कर सकते हैं। मैं अपाचे HTTP क्लाइंट का उपयोग करने की सलाह दूंगा, जो एंड्रॉइड के साथ आता है। यहाँ एक कोड का स्निपेट है जिसका उपयोग मैं एक HTTP POST भेजने के लिए करता था।

मुझे समझ नहीं आ रहा है कि "जेसन" नाम के एक वैरिएबल में ऑब्जेक्ट को भेजने का क्या कुछ भी करना है। यदि आप निश्चित नहीं हैं कि सर्वर वास्तव में क्या चाहता है, तो सर्वर को विभिन्न स्ट्रिंग्स भेजने के लिए एक परीक्षण कार्यक्रम लिखने पर विचार करें, जब तक कि आपको पता न हो कि इसमें किस प्रारूप की आवश्यकता है।

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
क्या पोस्टमैसेज एक JSON ऑब्जेक्ट है?
AndroidDev

postMessageपरिभाषित नहीं किया गया है
रैप्टर

किस समय के लिए है?
सिंह 89

क्या होगा अगर एक से अधिक स्ट्रिंग गुजरती हैं? जैसे postMessage2.toString ()। getBytes ("UTF8")
मयूर आर

एक POJO को Json स्ट्रिंग में बदलने के सुझाव?
tgkprog

155

यदि आप Apache HTTP क्लाइंट का उपयोग करते हैं तो एंड्रॉइड से एक json ऑब्जेक्ट भेजना आसान है। यह कैसे करना है पर एक कोड नमूना है। आपको नेटवर्क गतिविधियों के लिए एक नया थ्रेड बनाना चाहिए ताकि 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();      
    }

आप JSON भेजने और पुनः प्राप्त करने के लिए Google Gson का उपयोग भी कर सकते हैं ।


नमस्ते क्या यह संभव हो सकता है कि सर्वर को जेन्सन को हेडर सेट करने और उस हेडर में जसन कंटेंट डालने की आवश्यकता हो? मैं यूआरएल को HttpPost पोस्ट = नए HttpPost (" abc.com/xyz/usersgetuserdetails" ) के रूप में भेज रहा हूं ; लेकिन इसकी कहावत अमान्य अनुरोध त्रुटि है। कोड का रिमाइंडर समान है। दूसरी बात क्या json = हैडर = नया JSONObject (); यहाँ हो रहा
व्हाट्सएप

मुझे यकीन नहीं है कि सर्वर से किस तरह के अनुरोध की उम्मीद है। इसके लिए 'json = हैडर = नया JSONObject (); 'यह सिर्फ 2 json ऑब्जेक्ट्स बना रहा है।
प्रीमल पप्पाचन

@primpop - क्या कोई मौका है कि आप इस के साथ जाने के लिए एक साधारण php स्क्रिप्ट प्रदान करने में सक्षम हो सकते हैं? मैंने आपके कोड को लागू करने की कोशिश की, लेकिन मुझे अपने जीवन के लिए NULL के अलावा कुछ भी भेजने के लिए नहीं मिला।
kubiej21

आप इस StringWriter लेखक = new StringWriter () की तरह इनपुट के रूप में आउटपुट (यहाँ पर ऑब्जेक्ट में) प्राप्त कर सकते हैं; IOUtils.copy (में, लेखक, "UTF-8"); स्ट्रिंग theString = लेखक.toString ();
येकेर सिमसेक

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

मैंने ASP.Net mvc सर्वर पर json ऑब्जेक्ट पोस्ट किया है। मैं ASP.Net सर्वर में उसी जोंस स्ट्रिंग को कैसे क्वेरी कर सकता हूं।
कार्तिक

19

HttpPostAndroid Api Level 22 द्वारा हटा दिया गया है। तो, HttpUrlConnectionआगे के लिए उपयोग करें ।

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
स्वीकृत उत्तर को ह्रास किया गया है और यह दृष्टिकोण बेहतर है
कोडरबीसी

8

नीचे दिए गए लिंक पर Android HTTP के लिए आश्चर्यजनक रूप से अच्छी लाइब्रेरी उपलब्ध है:

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

सरल अनुरोध बहुत आसान हैं:

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

JSON ( https://github.com/loopj/android-async-http/issues/125 पर ) 'voidberg' को भेजने के लिए :

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

यह सभी अतुल्यकालिक है, एंड्रॉइड के साथ अच्छी तरह से काम करता है और आपके यूआई थ्रेड से कॉल करने के लिए सुरक्षित है। RespHandler उसी धागे पर चलेगा जिसे आपने इसे बनाया था (आम तौर पर, आपका UI थ्रेड)। यहां तक ​​कि इसमें JSON के लिए एक अंतर्निहित resonseHandler भी है, लेकिन मैं Google gson का उपयोग करना पसंद करता हूं।


क्या आप जानते हैं कि न्यूनतम sdk इस पर चलता है?
Esko918

अगर यह GUI नहीं है तो मुझे आश्चर्य होगा। क्यों नहीं इसे आज़माएं और अपने निष्कर्षों को पोस्ट करें।
एलेक्स

1
खैर मैंने इसके बजाय देशी पुस्तकालयों का उपयोग करने का फैसला किया। Theres उस के बारे में अधिक Informatoin और चूंकि im काफी Android के लिए नया है। Im वास्तव में एक iOS देव है। यह बेहतर है क्योंकि सिर्फ प्लग करने और किसी के साथ खेलने के बजाय सभी डॉक्स पर पढ़ने से कोड खत्म हो जाता है। हालांकि धन्यवाद
Esko918

3

अब चूंकि HttpClientपदावनत कर दिया गया है वर्तमान HttpUrlConnectionकनेक्शन कोड का उपयोग कनेक्शन बनाने और कनेक्शन से लिखने और पढ़ने के लिए उपयोग करना है। लेकिन मैंने वॉली का उपयोग करना पसंद किया । यह लाइब्रेरी Android AOSP से है। मुझे बनाने में JsonObjectRequestया उपयोग करने में बहुत आसान लगाJsonArrayRequest


2

इससे सरल कुछ भी नहीं हो सकता है। OkHttpLibrary का उपयोग करें

अपना जशन बनाएं

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

और इसे इस तरह भेजें।

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

Okhttp की ओर इशारा करते हुए कहा, जो एक उपयोगी पुस्तकालय है, लेकिन दिए गए कोड से बहुत मदद नहीं मिलती है। उदाहरण के लिए, RequestBody.create () में दिए गए तर्क क्या हैं? : अधिक जानकारी के लिए इस लिंक को देख vogella.com/tutorials/JavaLibrary-OkHttp/article.html
प्रेमी

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();
        }
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.