Як надіслати об’єкт JSON через Запит за допомогою Android?


115

Я хочу надіслати наступний текст JSON

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

до веб-сервісу і прочитати відповідь. Я вмію читати JSON. Проблема полягає в тому, що вищевказаний об'єкт JSON повинен бути надісланий іменем змінної jason.

Як я можу це зробити з андроїда? Назвіть такі кроки, як створення об’єкта запиту, встановлення заголовків вмісту тощо.

Відповіді:


97

Android не має спеціального коду для надсилання та отримання HTTP, ви можете використовувати стандартний код Java. Я рекомендую використовувати HTTP-клієнт Apache, який постачається з Android. Ось фрагмент коду, який я використовував для надсилання пошти HTTP.

Я не розумію, що посилання на об'єкт у змінній під назвою "жасон" пов'язана з будь-чим. Якщо ви не впевнені, що саме хоче сервер, подумайте про тестування програми для надсилання різних рядків на сервер, поки ви не дізнаєтеся, у якому форматі він повинен бути.

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 легко, якщо ви використовуєте HTTP-клієнт Apache. Ось зразок коду, як це зробити. Вам слід створити новий потік для мережевих дій, щоб не блокувати потік інтерфейсу користувача.

    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" ); Але помилка його неправдивого запиту. Повторний код коду той самий. По-друге, що означає json = header = новий JSONObject (); Що тут відбувається
AndroidDev

Я не впевнений, який запит очікує сервер. Щодо цього 'json = header = новий JSONObject (); 'це просто створення 2 json об’єктів.
Первинний Паппачан

@primpop - Чи є ймовірність, що ви зможете надати простий скрипт для php, який буде разом із цим? Я спробував реалізувати ваш код, але я все життя не міг змусити його надіслати щось, крім NULL.
kubiej21

ви можете отримати вихід з inputsputstream (в об'єкті тут) як рядок, як цей StringWriter Writer = new StringWriter (); IOUtils.copy (в, автор, "UTF-8"); String theString = write.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) {
    }
}

Я розміщую об’єкт json на сервері mvc ASP.Net. Як я можу запитати ту саму рядок json на сервері ASP.Net.?
Картік

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/isissue/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 і безпечно дзвонити з потоку інтерфейсу користувача. RespoHandler запуститься на тому самому потоці, з якого ви його створили (як правило, ваш потік інтерфейсу). У нього навіть є вбудований resonseHandler для JSON, але я вважаю за краще використовувати Google gson.


Чи знаєте ви мінімальний sdk, на який він працює?
Esko918

Я був би здивований, якби він був мінімальним, оскільки це не графічний інтерфейс. Чому б не спробувати це і опублікувати свої висновки.
Олексій

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
Даблер

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.