powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / Android [игнор отключен] [закрыт для гостей] / отправить jsonObject post запросом из android и получить ответ
20 сообщений из 20, страница 1 из 1
отправить jsonObject post запросом из android и получить ответ
    #39246540
nikomp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть android клиент, который посылает данные на сервер (PHP сервер). нужно отправить данные и получить ответ. Отправляю данные так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
class RequestTask extends AsyncTask<JSONObject, Void, Void> {

        private BufferedOutputStream bos;

        @Override
        protected Void doInBackground(JSONObject... json) {

            try {

                Log.d("myLogs","RequestTask.doInBackground");
                String OPEN_MYSITE = "http://192.168.1.37/index.php";
                URL url =new URL(OPEN_MYSITE);
                HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();

                //URL url = new URL("http://israelr_lap:8000/appreg");
                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setRequestProperty("Content-Type", "application/json");
                urlConnection.setRequestMethod("POST");
                urlConnection.setDoInput(true);
                urlConnection.setDoOutput(true);
                urlConnection.connect();

                Log.d("myLogs", "doInBackground " + json.toString()); // <- ТУТ ПРИХОДЯТ КРИВЫЕ ДАННЫЕ

                bos = new BufferedOutputStream(urlConnection.getOutputStream());
                bos.write(json.toString().getBytes());


                int responseCode=urlConnection.getResponseCode();

                if (responseCode == HttpsURLConnection.HTTP_OK) {
                    String result = urlConnection.getResponseMessage();
                    Log.d("", "server response: " + result); //проверить, что вернет сервер
                }
                else {
                    Log.d("myLogs","no");
                }


            } catch (Exception e) {
                System.out.println("Exp=" + e);
            }finally {
                try {
                    bos.flush(); //очищает поток output-a
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                //urlConnection.disconnect();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {

            //dialog.dismiss();
            super.onPostExecute(result);
        }

    }



в doInBackground приходит кривой jsonObject (строка из лога):
05-30 21:17:52.683 10074-10259/ru.startandroid.test2 D/myLogs: doInBackground [Lorg.json.JSONObject;@41a61200

данные пробую получить так:

Код: php
1.
2.
3.
4.
5.
if($_SERVER['REQUEST_METHOD'] == 'POST') {
    $data = file_get_contents("php://input");
    echo $data;
}
echo 'OK'



андроид приложение отрабатывает без ошибок, но и результата никакого нет, последнее сообщение в логе с кривым jsonObject. Что не так?

P/S
в интернете видел полно примеров как отправлять и получать данные, но где-то методы уже устарели, а где-то описано запутанно. Последняя вменяемая ссылка, которая попалась http://stackoverflow.com/questions/32546260/unable-to-post-the-jsonobject-from-android-to-php, но и там метод устарел.
...
Рейтинг: 0 / 0
отправить jsonObject post запросом из android и получить ответ
    #39246553
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
отправить jsonObject post запросом из android и получить ответ
    #39246683
nikomp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почему jsonObject приходит в doInBackground кривым?
...
Рейтинг: 0 / 0
отправить jsonObject post запросом из android и получить ответ
    #39246720
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikompв интернете видел полно примеров как отправлять и получать данные
Вот еще пример: http://www.androidhive.info/2012/10/android-push-notifications-using-google-cloud-messaging-gcm-php-and-mysql/

Сам проверял, в т.ч. и с GCM. Немного в этом плане устарела (GCM), но в плане php вполне рабочая.

Хотя, автор уже обновил статью: http://www.androidhive.info/2016/02/android-push-notifications-using-gcm-php-mysql-realtime-chat-app-part-2/
...
Рейтинг: 0 / 0
отправить jsonObject post запросом из android и получить ответ
    #39246813
nikomp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

да, примеров полно, с конкретной бы ситуацией разобраться )
...
Рейтинг: 0 / 0
отправить jsonObject post запросом из android и получить ответ
    #39246827
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikompс конкретной бы ситуацией разобраться )
Отправку ты не показываешь.

К примеру, я так регистрировал нового пользователя через пост

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
<?php
 
// response json
$json = array();
 
/**
 * Registering a user device
 * Store reg id in users table
 */
if (isset($_POST["name"]) && isset($_POST["email"]) && isset($_POST["regId"])) {
    $name = $_POST["name"];
    $email = $_POST["email"];
    $gcm_regid = $_POST["regId"]; // GCM Registration ID
    // Store user details in db
    include_once './db_functions.php';
    include_once './GCM.php';
 
    $db = new DB_Functions();
    $gcm = new GCM();
 
    $res = $db->storeUser($name, $email, $gcm_regid);
 
    $registatoin_ids = array($gcm_regid);
    $message = array("product" => "shirt");
 
    $result = $gcm->send_notification($registatoin_ids, $message);
 
    echo $result;
} else {
    // user details missing
}
?>



А так формировал json для gcm. Уж поверь, он нежнее, чем твое ПО к формату.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
send_message.php
<?php
if (isset($_GET["regId"]) && isset($_GET["message"])) {
    $regId = $_GET["regId"];
    $message = $_GET["message"];
     
    include_once './GCM.php';
     
    $gcm = new GCM();
 
    $registatoin_ids = array($regId);
    $message = array("message" => $message);
 
    $result = $gcm->send_notification($registatoin_ids, $message);
 
    echo $result;
}
?>

...
Рейтинг: 0 / 0
отправить jsonObject post запросом из android и получить ответ
    #39246830
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И сама отправка в gcm, но это все есть в примерах выше.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
<?php
 
class GCM {
 
    //put your code here
    // constructor
    function __construct() {
         
    }
 
    /**
     * Sending Push Notification
     */
    public function send_notification($registatoin_ids, $message) {
        // include config
        include_once './config.php';
 
        // Set POST variables
        $url = 'https://android.googleapis.com/gcm/send';
        $url = 'https://gcm-http.googleapis.com/gcm/send';

        $msg = array (
		'message' 	=> $message
	);

 
        $fields = array(
            'registration_ids' => $registatoin_ids,
            'data' => $msg,
        );
 
        $headers = array(
            'Authorization: key=' . GOOGLE_API_KEY,
            'Content-Type: application/json'
        );
        // Open connection
        $ch = curl_init();
 
        // Set the url, number of POST vars, POST data
        curl_setopt($ch, CURLOPT_URL, $url);
 
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 
        // Disabling SSL Certificate support temporarly
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
 
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
 
        // Execute post
        $result = curl_exec($ch);
        if ($result === FALSE) {
            die('Curl failed: ' . curl_error($ch));
        }
 
        // Close connection
        curl_close($ch);
        echo $result;
    }
 
}
 
?>

...
Рейтинг: 0 / 0
отправить jsonObject post запросом из android и получить ответ
    #39246881
nikomp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

отправка у меня с устройства идет
...
Рейтинг: 0 / 0
отправить jsonObject post запросом из android и получить ответ
    #39246908
nikomp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а как вообще на стороне php сервера проверить пришло у меня в php скрипт что-то или нет? От моего кода из первого поста

Код: php
1.
2.
3.
4.
5.
if($_SERVER['REQUEST_METHOD'] == 'POST') {
    $data = file_get_contents("php://input");
    echo $data;
}
echo 'OK'



я ожидаю, что после отправки запроса с android устройства в браузере на сервере я увижу пришедшие данные. Или я что-то не так понимаю?
...
Рейтинг: 0 / 0
отправить jsonObject post запросом из android и получить ответ
    #39246946
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikompИли я что-то не так понимаю?
Не так. На сервере нужно куда-то принятое записать, хоть в текстовый файл, хоть в базу.
И после уже можно отображать в браузере.

Лучше все таки сходить по моим ссылкам. А лучше не просто сходить, а воспроизвести примеры.

Добавлю комментарии к получению из примера выше:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
<?php
 
// response json
$json = array();
 
/**
 * Registering a user device
 * Store reg id in users table
 */
// проверка на наличие данных в запросе, имя, мыло и ид
if (isset($_POST["name"]) && isset($_POST["email"]) && isset($_POST["regId"])) {
    $name = $_POST["name"];
    $email = $_POST["email"];
    $gcm_regid = $_POST["regId"]; // GCM Registration ID
    // Store user details in db
    include_once './db_functions.php';
    include_once './GCM.php';
 
    $db = new DB_Functions();
    $gcm = new GCM();
 
    // данные о пользователе записываются в базу
    $res = $db->storeUser($name, $email, $gcm_regid);
    // отправляется тестовое сообщение этому пользователю
    $registatoin_ids = array($gcm_regid);
    $message = array("product" => "shirt");
    // сама отправка
    $result = $gcm->send_notification($registatoin_ids, $message);
 
    echo $result;
} else {
    // user details missing
}
?>

...
Рейтинг: 0 / 0
отправить jsonObject post запросом из android и получить ответ
    #39246969
nikomp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanНе так. На сервере нужно куда-то принятое записать, хоть в текстовый файл, хоть в базу.


а разве

Код: php
1.
echo $data;



не выведет данные?
по ссылкам вашим переходил, но пока он для меня сложноват
...
Рейтинг: 0 / 0
отправить jsonObject post запросом из android и получить ответ
    #39246977
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikompне выведет данные?
Выведет. Туда, откуда пришло. В телефон то есть.
...
Рейтинг: 0 / 0
отправить jsonObject post запросом из android и получить ответ
    #39247556
nikomp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
продолжаю биться над проблемой. есть небольшие результаты. удалось получить ответ от php-сервера, прочитать данные в InputStream и вывести в лог. Но вот с передачей мистика какая-то творится. Вот код:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
String MY_SITE = "http://192.168.1.37/index.php"; // Пока тут адрес локального сервера
                URL url =new URL(MY_SITE); 
                HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();

                urlConnection.setRequestProperty("Content-Type", "application/json");
                urlConnection.setRequestMethod("POST");
                urlConnection.setDoInput(true);
                urlConnection.setDoOutput(true);
                
                Log.d("myLogs", "___" + jsonObj.toString()); <-ЭТО ПОСЛЕДНЯЯ СТРОКА В ЛОГЕ

                BufferedOutputStream bos = new BufferedOutputStream(urlConnection.getOutputStream());
                Log.d("myLogs", "qqq");
                bos.write(jsonObj.toString().getBytes());


в логе все заканчивается на Log.d("myLogs", "___" + jsonObj.toString());
никаких ошибок, вообще ничего просто, такое ощущение что
BufferedOutputStream bos = new BufferedOutputStream(urlConnection.getOutputStream()); просто не выполняется.

Может разрешения какие-то нужно прописать?
...
Рейтинг: 0 / 0
отправить jsonObject post запросом из android и получить ответ
    #39247566
nikomp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ошибку нашел в логе


05-31 20:59:40.251 2935-2996/ru.startandroid.test2 D/myLogs: ___{"nods":[],"name":"Маршрут 1","rating":0}
05-31 20:59:40.251 2935-2996/ru.startandroid.test2 W/System.err: java.net.ProtocolException: cannot write request body after response has been read
05-31 20:59:40.261 2935-2996/ru.startandroid.test2 W/System.err: at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:194)
05-31 20:59:40.261 2935-2996/ru.startandroid.test2 W/System.err: at ru.startandroid.test2.MapsActivity$RequestTask.doInBackground(MapsActivity.java:671)
05-31 20:59:40.271 2935-2996/ru.startandroid.test2 W/System.err: at ru.startandroid.test2.MapsActivity$RequestTask.doInBackground(MapsActivity.java:602)
05-31 20:59:40.271 2935-2996/ru.startandroid.test2 W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:264)
05-31 20:59:40.271 2935-2996/ru.startandroid.test2 W/System.err: at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
05-31 20:59:40.271 2935-2996/ru.startandroid.test2 W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:137)
05-31 20:59:40.271 2935-2996/ru.startandroid.test2 W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
05-31 20:59:40.271 2935-2996/ru.startandroid.test2 W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
05-31 20:59:40.271 2935-2996/ru.startandroid.test2 W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
05-31 20:59:40.271 2935-2996/ru.startandroid.test2 W/System.err: at java.lang.Thread.run(Thread.java:856)

ищу решение ...
...
Рейтинг: 0 / 0
отправить jsonObject post запросом из android и получить ответ
    #39247736
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikompищу решение ...
А чего искать? Получил ответ и пытаешься его модифицировать.
nikomp
Код: java
1.
bos.write(jsonObj.toString().getBytes());
...
Рейтинг: 0 / 0
отправить jsonObject post запросом из android и получить ответ
    #39247781
nikomp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну да, разобрался уже.
осталось разобраться с php сервером.

Код: php
1.
2.
3.
4.
if($_SERVER['REQUEST_METHOD'] == 'POST') {
    $data = file_get_contents("php://input");
    echo 'data:{'.json_encode($data).'}';
}



на устройство приходит data:{}, т.е. делаю вывод либо я неправильно готовлю данные для передачи, либо неправильно их принимаю, но запрос на сервер приходит
...
Рейтинг: 0 / 0
отправить jsonObject post запросом из android и получить ответ
    #39247785
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikomp,

см. выше, как получить данные из post. 19240123
...
Рейтинг: 0 / 0
отправить jsonObject post запросом из android и получить ответ
    #39247806
nikomp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,
а в примере выше данные на сервер приходят в json?
правильно понимаю, что $data = file_get_contents("php://input"); не принимает данные?
...
Рейтинг: 0 / 0
отправить jsonObject post запросом из android и получить ответ
    #39247823
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nikompа в примере выше данные на сервер приходят в json?
Да.
nikomp$data = file_get_contents("php://input"); не принимает данные?
Вообще впервые вижу такую конструкцию. :)
...
Рейтинг: 0 / 0
отправить jsonObject post запросом из android и получить ответ
    #39248496
nikomp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
рабочий код! (может кому-то поможет)

на устройстве, в AsyncTask. формирование jsonObject из файла, отправка на php-сервер, получение ответа от сервера

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
    class RequestTask extends AsyncTask<Void, Void, Void> {

        //private BufferedOutputStream bos;
        JSONObject jsonObj;

        @Override
        protected Void doInBackground(Void... params) {

            Log.d("myLogs","doInBackground");
            // Формируем jsonObject из файла
            try {

                File yourFile = new File(Environment.getExternalStorageDirectory(), "/MyFiles/fileSD1.txt");
                FileInputStream stream = new FileInputStream(yourFile);
                String jsonStr = null;
                try {
                    FileChannel fc = stream.getChannel();
                    MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());

                    jsonStr = Charset.defaultCharset().decode(bb).toString();
                }
                finally {
                    stream.close();
                }

                jsonObj = new JSONObject(jsonStr);

                Log.d("myLogs",jsonObj.toString());

                // Отправка json, отправку делаем в AsyncTask


            }
            catch (Exception e) {
                e.printStackTrace();
            }

            // Отправка данных
            try {

                String MY_SITE = "http://192.168.1.37/index.php"; // Пока тут адрес локального сервера
                URL url =new URL(MY_SITE); // пример "http://ru.stackoverflow.com/"
                HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();

                urlConnection.setRequestProperty("Content-Type", "application/json");
                urlConnection.setRequestMethod("POST");
                urlConnection.setConnectTimeout(5000);
                urlConnection.setDoInput(true);
                urlConnection.setDoOutput(true);

                Log.d("myLogs", "___" + jsonObj.toString());
                BufferedOutputStream bos = new BufferedOutputStream(urlConnection.getOutputStream());
                Log.d("myLogs", "qqq");
                bos.write(jsonObj.toString().getBytes());
                bos.flush();
                bos.close();

                Log.d("myLogs", "отправили данные");
                if (urlConnection.getResponseCode()==HttpURLConnection.HTTP_OK) {
                    String result = urlConnection.getResponseMessage();
                    Log.d("myLogs", "server response: " + result); //проверить, что вернет сервер, сервер должен вернуть тестовую строку

                    BufferedReader reader = new BufferedReader(
                            new InputStreamReader(urlConnection.getInputStream()));

                    StringBuffer sb = new StringBuffer(1024);
                    String tmp="";
                    while((tmp=reader.readLine())!=null)
                        sb.append(tmp).append("\n");
                    reader.close();

                    Log.d("myLogs",sb.toString());

                }
                else {
                    Log.d("myLogs","no");
                }

            } catch (Exception e) {
                //System.out.println("Exp=" + e);
                e.printStackTrace();

            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {

             super.onPostExecute(result);
        }

        @Override
        protected void onPreExecute() {

            super.onPreExecute();
        }
    }



php-сервер. прием данных, запись в файл, отправка ответа.

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
if($_SERVER['REQUEST_METHOD'] == 'POST') {
	$data = file_get_contents('php://input');
	
		//Запись полученных данных в файл
  $file = fopen ("file.txt","r+");
  //$str = "Hello, world!";
  if ( !$file )
  {
    echo("Ошибка открытия файла");
  }
  else
  {
    fputs ( $file, $data);
  }
  fclose ($file);
	
	echo '{data:'.$data.'}';
}
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Android [игнор отключен] [закрыт для гостей] / отправить jsonObject post запросом из android и получить ответ
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]