Гость
Форумы / Android [игнор отключен] [закрыт для гостей] / отправить jsonObject post запросом из android и получить ответ / 20 сообщений из 20, страница 1 из 1
30.05.2016, 21:41
    #39246540
nikomp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отправить jsonObject post запросом из android и получить ответ
есть 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
30.05.2016, 21:59
    #39246553
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отправить jsonObject post запросом из android и получить ответ
...
Рейтинг: 0 / 0
31.05.2016, 08:44
    #39246683
nikomp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отправить jsonObject post запросом из android и получить ответ
почему jsonObject приходит в doInBackground кривым?
...
Рейтинг: 0 / 0
31.05.2016, 09:10
    #39246720
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отправить jsonObject post запросом из android и получить ответ
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
31.05.2016, 10:28
    #39246813
nikomp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отправить jsonObject post запросом из android и получить ответ
wadman,

да, примеров полно, с конкретной бы ситуацией разобраться )
...
Рейтинг: 0 / 0
31.05.2016, 10:38
    #39246827
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отправить jsonObject post запросом из android и получить ответ
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
31.05.2016, 10:39
    #39246830
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отправить jsonObject post запросом из android и получить ответ
И сама отправка в 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
31.05.2016, 11:12
    #39246881
nikomp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отправить jsonObject post запросом из android и получить ответ
wadman,

отправка у меня с устройства идет
...
Рейтинг: 0 / 0
31.05.2016, 11:25
    #39246908
nikomp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отправить jsonObject post запросом из android и получить ответ
а как вообще на стороне 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
31.05.2016, 11:46
    #39246946
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отправить jsonObject post запросом из android и получить ответ
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
31.05.2016, 11:58
    #39246969
nikomp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отправить jsonObject post запросом из android и получить ответ
wadmanНе так. На сервере нужно куда-то принятое записать, хоть в текстовый файл, хоть в базу.


а разве

Код: php
1.
echo $data;



не выведет данные?
по ссылкам вашим переходил, но пока он для меня сложноват
...
Рейтинг: 0 / 0
31.05.2016, 12:00
    #39246977
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отправить jsonObject post запросом из android и получить ответ
nikompне выведет данные?
Выведет. Туда, откуда пришло. В телефон то есть.
...
Рейтинг: 0 / 0
31.05.2016, 20:47
    #39247556
nikomp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отправить jsonObject post запросом из android и получить ответ
продолжаю биться над проблемой. есть небольшие результаты. удалось получить ответ от 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
31.05.2016, 21:09
    #39247566
nikomp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отправить jsonObject post запросом из android и получить ответ
ошибку нашел в логе


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
01.06.2016, 08:47
    #39247736
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отправить jsonObject post запросом из android и получить ответ
nikompищу решение ...
А чего искать? Получил ответ и пытаешься его модифицировать.
nikomp
Код: java
1.
bos.write(jsonObj.toString().getBytes());
...
Рейтинг: 0 / 0
01.06.2016, 09:39
    #39247781
nikomp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отправить jsonObject post запросом из android и получить ответ
ну да, разобрался уже.
осталось разобраться с 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
01.06.2016, 09:42
    #39247785
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
отправить jsonObject post запросом из android и получить ответ
nikomp,

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

на устройстве, в 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
Форумы / Android [игнор отключен] [закрыт для гостей] / отправить jsonObject post запросом из android и получить ответ / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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