Làm cách nào để gửi một đối tượng JSON qua Yêu cầu với Android?


115

Tôi muốn gửi văn bản JSON sau đây

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

đến một dịch vụ web và đọc phản hồi. Tôi biết cách đọc JSON. Vấn đề là đối tượng JSON ở trên phải được gửi bằng tên biến jason.

Làm thế nào tôi có thể làm điều này từ Android? Các bước như tạo đối tượng yêu cầu, đặt tiêu đề nội dung, v.v.

Câu trả lời:


97

Android không có mã đặc biệt để gửi và nhận HTTP, bạn có thể sử dụng mã Java tiêu chuẩn. Tôi khuyên bạn nên sử dụng ứng dụng khách HTTP Apache, đi kèm với Android. Đây là một đoạn mã tôi đã sử dụng để gửi HTTP POST.

Tôi không hiểu việc gửi đối tượng trong một biến có tên là "jason" có liên quan gì. Nếu bạn không chắc chắn chính xác máy chủ muốn gì, hãy xem xét việc viết chương trình thử nghiệm để gửi các chuỗi khác nhau đến máy chủ cho đến khi bạn biết định dạng của nó cần ở định dạng nào.

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 có phải là một đối tượng JSON không?
AndroidDev

postMessagekhông được xác định
Raptor

thời gian chờ là gì?
Lion789

Điều gì nếu truyền nhiều hơn một chuỗi? như postMessage2.toString (). getBytes ("UTF8")
Mayur R. Amipara

Gợi ý chuyển đổi chuỗi POJO sang Json?
tgkprog

155

Gửi một đối tượng json từ Android thật dễ dàng nếu bạn sử dụng Apache HTTP Client. Đây là một mẫu mã về cách làm điều đó. Bạn nên tạo một luồng mới cho các hoạt động mạng để không khóa luồng 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();      
    }

Bạn cũng có thể sử dụng Google Gson để gửi và truy xuất JSON.


Xin chào, có thể máy chủ yêu cầu tôi thiết lập một tiêu đề đã được cân bằng JSON và đặt nội dung json trong tiêu đề đó không? Tôi gửi url dưới dạng httpPost post = new HttpPost (" abc.com/xyz/usersgetuserdetails" ); Nhưng nó nói lỗi yêu cầu không hợp lệ. Phần còn lại của mã là như nhau. Thứ hai, json = header = new JSONObject ();
Chuyện

Tôi không chắc chắn loại yêu cầu nào được máy chủ mong đợi. Đối với điều này 'json = header = new JSONObject (); 'nó chỉ tạo ra 2 đối tượng json.
Pappachan nguyên thủy

@primpop - Có bất kỳ cơ hội nào mà bạn có thể cung cấp một tập lệnh php đơn giản để đi cùng với điều này không? Tôi đã thử triển khai mã của bạn, nhưng trong suốt cuộc đời tôi, tôi không thể nhận được nó để gửi bất cứ thứ gì ngoài NULL.
kubiej21

bạn có thể lấy đầu ra từ inputsputstream (trong đối tượng ở đây) dưới dạng chuỗi như StringWriter writ = new StringWriter (); IOUtils.copy (trong, nhà văn, "UTF-8"); Chuỗi theString = wr.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) {
    }
}

Tôi đã đăng đối tượng json lên máy chủ mvc ASP.Net. Làm cách nào tôi có thể truy vấn chuỗi json tương tự trong máy chủ ASP.Net.?
Karthick

19

HttpPostkhông được chấp nhận bởi Android Api Cấp 22. Vì vậy, hãy sử dụng HttpUrlConnectionđể biết thêm.

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
Câu trả lời được chấp nhận bị khấu hao và cách tiếp cận này tốt hơn
CoderBC

8

Có một thư viện đẹp đáng ngạc nhiên cho Android HTTP có sẵn tại liên kết dưới đây:

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

Yêu cầu đơn giản rất dễ dàng:

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

Để gửi JSON (tín dụng cho `voidberg 'tại 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);

Tất cả đều không đồng bộ, hoạt động tốt với Android và an toàn để gọi từ luồng UI của bạn. ResponsHandler sẽ chạy trên cùng một luồng mà bạn đã tạo từ đó (thông thường, luồng UI của bạn). Nó thậm chí còn có một resonseHandler tích hợp cho JSON, nhưng tôi thích sử dụng google gson hơn.


Bạn có biết sdk tối thiểu này chạy trên?
Esko918

Tôi sẽ ngạc nhiên nếu nó có mức tối thiểu vì nó không phải là GUI. Tại sao không thử nó và đăng những phát hiện của bạn.
Alex

1
Vâng, tôi quyết định sử dụng các thư viện bản địa thay thế. Có nhiều thông tin hơn về điều đó và vì tôi khá mới với Android. Tôi thực sự là một nhà phát triển iOS. Nó tốt hơn vì tôi đang đọc tất cả các tài liệu thay vì chỉ cắm và chơi với mã của ai đó. Dù vậy cũng xin cảm ơn
Esko918

3

Bây giờ vì HttpClientkhông dùng nữa nên mã làm việc hiện tại là sử dụng HttpUrlConnectionđể tạo kết nối và viết và đọc từ kết nối. Nhưng tôi thích sử dụng Volley . Thư viện này là từ Android AOSP. Tôi thấy rất dễ sử dụng để làm JsonObjectRequesthoặcJsonArrayRequest


2

Không có gì có thể đơn giản hơn thế này. Sử dụng thư viện OkHttpL

Tạo json của bạn

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

và gửi nó như thế này.

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

Được khuyến khích để chỉ vào okhttp, đây là một thư viện hữu ích, nhưng mã được đưa ra không giúp được gì nhiều. Ví dụ: các đối số được truyền cho RequestBody.create () là gì? Xem liên kết này để biết thêm chi tiết: vogella.com/tutorials/JavaL Library
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();
        }
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.