จะส่งออบเจ็กต์ JSON ผ่านคำขอด้วย Android ได้อย่างไร


115

ฉันต้องการส่งข้อความ JSON ต่อไปนี้

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

ไปยังบริการบนเว็บและอ่านคำตอบ ฉันรู้วิธีอ่าน JSON ปัญหาคือว่าวัตถุ JSON jasonข้างต้นจะต้องถูกส่งไปในชื่อตัวแปร

ฉันจะทำสิ่งนี้จาก Android ได้อย่างไร มีขั้นตอนอย่างไรเช่นการสร้างออบเจ็กต์คำขอการตั้งค่าส่วนหัวของเนื้อหาเป็นต้น

คำตอบ:


97

Android ไม่มีรหัสพิเศษสำหรับการส่งและรับ HTTP คุณสามารถใช้รหัส Java มาตรฐานได้ ขอแนะนำให้ใช้ไคลเอ็นต์ Apache HTTP ซึ่งมาพร้อมกับ Android นี่คือตัวอย่างโค้ดที่ฉันใช้ในการส่ง HTTP POST

ฉันไม่เข้าใจว่าการส่งวัตถุในตัวแปรชื่อ "jason" เกี่ยวข้องกับอะไร หากคุณไม่แน่ใจว่าเซิร์ฟเวอร์ต้องการอะไรให้ลองเขียนโปรแกรมทดสอบเพื่อส่งสตริงต่างๆไปยังเซิร์ฟเวอร์จนกว่าคุณจะรู้ว่าต้องอยู่ในรูปแบบใด

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 เป็นวัตถุ JSON หรือไม่
AndroidDev

postMessageไม่ได้กำหนดไว้
Raptor

หมดเวลาสำหรับอะไร?
Lion789

จะเกิดอะไรขึ้นถ้าส่งมากกว่าหนึ่งสตริง? เช่น postMessage2.toString (). getBytes ("UTF8")
Mayur R. Amipara

คำแนะนำในการแปลงสตริง POJO เป็น Json หรือไม่
tgkprog

155

การส่งวัตถุ json จาก Android เป็นเรื่องง่ายหากคุณใช้ Apache HTTP Client นี่คือตัวอย่างโค้ดเกี่ยวกับวิธีการทำ คุณควรสร้างเธรดใหม่สำหรับกิจกรรมเครือข่ายเพื่อไม่ให้ล็อกเธรด 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();      
    }

คุณยังสามารถใช้Google Gsonเพื่อส่งและดึงข้อมูล JSON


สวัสดีเป็นไปได้ไหมที่เซิร์ฟเวอร์ต้องการให้ฉันตั้งค่า JSON ส่วนหัวและใส่เนื้อหา json ในส่วนหัวนั้น ฉันส่ง url เป็น HttpPost post = new HttpPost (" abc.com/xyz/usersgetuserdetails" ); แต่มันบอกว่าคำขอไม่ถูกต้องเกิดข้อผิดพลาด remiander ของรหัสเหมือนกัน ประการที่สอง json = header = new JSONObject (); เกิดอะไรขึ้นที่นี่
AndroidDev

ฉันไม่แน่ใจว่าเซิร์ฟเวอร์ต้องการคำขอประเภทใด สำหรับสิ่งนี้ 'json = header = new JSONObject (); 'มันเป็นเพียงการสร้างวัตถุ json 2 ชิ้น
ปฐมกัปปะจันทร์

@primpop - มีโอกาสไหมที่คุณจะสามารถจัดเตรียมสคริปต์ php ง่ายๆเพื่อใช้กับสิ่งนี้ได้? ฉันพยายามติดตั้งโค้ดของคุณ แต่ตลอดชีวิตของฉันไม่สามารถให้มันส่งสิ่งอื่นใดนอกจาก NULL
kubiej21

คุณสามารถรับเอาต์พุตจาก inputsputstream (ใน object ที่นี่) เป็นสตริงเช่น StringWriter writer = new StringWriter (); IOUtils.copy (ใน, นักเขียน, "UTF-8"); สตริง 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) {
    }
}

ฉันได้โพสต์วัตถุ json ไปยังเซิร์ฟเวอร์ ASP.Net mvc ฉันจะสอบถามสตริง json เดียวกันในเซิร์ฟเวอร์ ASP.Net ได้อย่างไร
Karthick

19

HttpPostเลิกใช้แล้วโดย Android Api ระดับ 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
คำตอบที่ยอมรับคือคิดค่าเสื่อมราคาและแนวทางนี้ดีกว่า
CoderBC

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 (เครดิตไปที่ `` voidberg 'ที่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);

เป็นแบบอะซิงโครนัสทั้งหมดทำงานได้ดีกับ Android และปลอดภัยในการโทรจากเธรด UI ของคุณ responseHandler จะทำงานบนเธรดเดียวกับที่คุณสร้างขึ้น (โดยทั่วไปคือเธรด UI ของคุณ) แม้จะมี resonseHandler ในตัวสำหรับ JSON แต่ฉันชอบใช้ google gson


คุณรู้หรือไม่ว่า sdk ขั้นต่ำนี้ทำงานได้หรือไม่?
Esko918

ฉันจะแปลกใจถ้ามันมีขั้นต่ำเนื่องจากไม่ใช่ GUI ทำไมไม่ลองใช้และโพสต์สิ่งที่คุณค้นพบ
อเล็กซ์

1
ฉันตัดสินใจใช้ไลบรารีดั้งเดิมแทน มีข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้และเนื่องจากฉันค่อนข้างใหม่สำหรับ Android ฉันเป็นนักพัฒนา iOS จริงๆ ดีกว่าเนื่องจากฉันอ่านเอกสารทั้งหมดแทนที่จะเสียบและเล่นกับรหัสของใครบางคน ขอบคุณ
Esko918

3

ตอนนี้เนื่องจากHttpClientเลิกใช้แล้วรหัสการทำงานปัจจุบันคือการใช้HttpUrlConnectionเพื่อสร้างการเชื่อมต่อและเขียนและอ่านจากการเชื่อมต่อ แต่ผมต้องการที่จะใช้วอลเล่ย์ ไลบรารีนี้มาจาก Android AOSP ฉันพบว่าใช้งานง่ายมากในการทำJsonObjectRequestหรือJsonArrayRequest


2

ไม่มีอะไรจะง่ายไปกว่านี้ ใช้ OkHttpLibrary

สร้าง json ของคุณ

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
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();
        }
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.