Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Ssnake707
8 / 8 / 6
Регистрация: 02.02.2015
Сообщений: 140
#1

HttpUrlConnection - Программирование Android

08.10.2015, 14:19. Просмотров 872. Ответов 15
Метки нет (Все метки)

Всем привет, не могу разобраться с HttpUrlConnection, написал код по рекомендациям Android и что-то работает не так.
По порядку.
1) Есть задача, нужно на rest послать Json файл.
код сборки Json файла
Java
1
2
3
4
5
6
7
8
9
10
11
12
JSONObject jsonObject = new JSONObject();
jsonObject.put("problem_id", 3);
jsonObject.put("comment", "Описание проблемы");
SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy - hh:mm");
jsonObject.put("request_date", format.format(new Date()));
JSONArray jsonArray = new JSONArray();
jsonArray.put(43.2477689);
jsonArray.put(76.932101);
jsonObject.put("geom", jsonArray);
// беру из Bitmap картинку в виде массива байт.
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
Далее вызываю метод для отправки Json файла и картинки
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
HttpURLConnection http = null;
        try {
            URL url = new URL("ссылка на rest");
            http = (HttpURLConnection) url.openConnection();
            http.setRequestMethod("GET");
            http.setDoOutput(true);
            http.setDoInput(true);
            http.setChunkedStreamingMode(0);
            Log.d("JSON", "*****");
            DataOutputStream outputStream = new DataOutputStream(http.getOutputStream());
            outputStream.writeUTF(jsonObject.toString());
            // b это массив byte, содержащий картинку.
            outputStream.write(b,0,b.length);
            outputStream.flush();
            // получаю ответ с rest
            BufferedInputStream buf = new BufferedInputStream(http.getInputStream());
            String s = "";
            int i;
            i=buf.read();
            while (i!=-1){
                s+=(char)i;
            }
            Log.d("JSON",s);
        }finally {
            if (http != null) {
                http.disconnect();
                Log.d("JSON","finally");
            }
        }
проблема в том, что в консоль выводится
JSON
1
{"comment":"Описание проблемы","geom":[43.2477689,76.932101],"request_date":"08.10.2015 - 05:04","problem_id":3}
JSON﹕ *****
JSON﹕ finally
Т.е. строчка
Java
1
DataOutputStream outputStream = new DataOutputStream(http.getOutputStream());
не срабатывает.
Прошу помощи, уже весь интернет перелазил и не могу найти решение.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.10.2015, 14:19     HttpUrlConnection
Посмотрите здесь:

HttpURLConnection запрос - Программирование Android
Делаю запрос на сервер public class AsyncTaskc extends AsyncTask<Void, String, String> { private String urls; public...

Использование HttpURLConnection - Программирование Android
Всем привет. замечаю странное поведение коннекта к локальному серваку - который реально всегда доступен по вай фаю. Запросы делаются раз...

HttpURLConnection, ошибка - Программирование Android
Пытаюсь получить данную xml из инета: http://katolik.ru/mir.feed?type=rss try { URL url = new URL("...

HttpURLConnection cookie аутентификация - Программирование Android
Здравствуйте, такой вопрос есть url1 = http://site.com/accounts/login/?next=/ где post запросом передается user,pass если все...

HttpURLConnection - не читает заголовки и контент - Программирование Android
Делаю прямую авторизацию Вконтакте (отбитая тема, как я понял). Запросы на авторизацию провожу в AsyncTask и таких запроса три, но один...

Проверка соединения с сайтом через HttpUrlConnection - Программирование Android
я нашла кучу информации, где после подключения что-либо выдает. Как написать программный код, чтоб выдавало только удалось подсоединиться...

HttpURLConnection и JSON - обязательно ли наследоваться от AsyncTask? - Программирование Android
Всем доброго времени суток. Помогите пожалуйста, чтобы получить с сайта JSON, обязательно ли наследоваться от AsyncTask<Void, Void, Void>...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 651
08.10.2015, 14:44     HttpUrlConnection #2
Ssnake707, через catch слови ошибку если есть и выведи в лог. Может ты из UI потока пытаешься с сетью работать? так делать нельзя.
Ssnake707
8 / 8 / 6
Регистрация: 02.02.2015
Сообщений: 140
08.10.2015, 15:02  [ТС]     HttpUrlConnection #3
Mikalai, Пробовал сделать и через поток Thread.
Класс потока.
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
private class goRest extends Thread{
        private JSONObject jsonObject = null;
        private byte[] bytes = null;
 
        private goRest(JSONObject jsonObject, byte[] bytes) {
            this.jsonObject = jsonObject;
            this.bytes = bytes;
        }
 
        @Override
        public void run()  {
            super.run();
            HttpURLConnection http = null;
            try {
                URL url = new URL("ссылка");
                http = (HttpURLConnection) url.openConnection();
 
 
                http.setRequestMethod("GET");
                http.setDoOutput(true);
                http.setDoInput(true);
                http.setChunkedStreamingMode(0);
                Log.d("JSON", "*****");
                DataOutputStream outputStream = (DataOutputStream) http.getOutputStream();
                outputStream.writeUTF(jsonObject.toString());
                outputStream.write(bytes,0,bytes.length);
                outputStream.flush();
                BufferedInputStream buf = new BufferedInputStream(http.getInputStream());
                String s = "";
                int i;
                i=buf.read();
                while (i!=-1){
                    s+=(char)i;
                }
                Log.d("JSON",s);
            } catch (MalformedURLException e) {
                Log.d("JSON",e.getMessage());
            } catch (ProtocolException e) {
                Log.d("JSON", e.getMessage());
            } catch (IOException e) {
                Log.d("JSON", e.getMessage());
            } finally {
                if (http != null) {
                    http.disconnect();
                    Log.d("JSON","finally");
                }
            }
        }
    }
Вызов потока
Java
1
2
goRest http = new goRest(jsonObject,bos.toByteArray());
http.run();
Ни один catch не срабатывает

Добавлено через 12 минут
Только сейчас заметил что срабатывает catch в другом методе.
вот код метода
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
JSONObject jsonObject = new JSONObject();
                    try {
                        jsonObject.put("problem_id", 3);
                        jsonObject.put("comment", "Описание проблемы");
                        SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy - hh:mm");
                        jsonObject.put("request_date", format.format(new Date()));
                        JSONArray jsonArray = new JSONArray();
                        jsonArray.put(43.2477689);
                        jsonArray.put(76.932101);
                        jsonObject.put("geom", jsonArray);
                        ByteArrayOutputStream bos = new ByteArrayOutputStream();
                        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
                        Log.d("JSON", jsonObject.toString());
                        goRest http = new goRest(jsonObject,bos.toByteArray());
                        http.run();
                    } catch (Exception e) {
                        Log.d("JSON","тут срабатывает catch");
                    }
                }
Alex Ziko
2 / 2 / 1
Регистрация: 27.07.2015
Сообщений: 32
08.10.2015, 15:05     HttpUrlConnection #4
может быть лучше POST заюзать для отправки json?
Ssnake707
8 / 8 / 6
Регистрация: 02.02.2015
Сообщений: 140
08.10.2015, 15:06  [ТС]     HttpUrlConnection #5
Alex Ziko, Пока не задумывался post или get, ошибка там и там остается
Alex Ziko
2 / 2 / 1
Регистрация: 27.07.2015
Сообщений: 32
08.10.2015, 15:11     HttpUrlConnection #6
логи нужны... иначе это гадание... + не вижу где битмапа создается
Ssnake707
8 / 8 / 6
Регистрация: 02.02.2015
Сообщений: 140
08.10.2015, 15:17  [ТС]     HttpUrlConnection #7
Alex Ziko, Подскажи куда поставить логи для ясности, bitmap создается одним из двух способов, первый это когда пользователь делает фотографию и второй когда пользователь выбирает фотографию из галереи.
Java
1
bitmap = BitmapFactory.decodeFile(fileName);
Alex Ziko
2 / 2 / 1
Регистрация: 27.07.2015
Сообщений: 32
08.10.2015, 15:32     HttpUrlConnection #8
битмапа точно не нул?
Ssnake707
8 / 8 / 6
Регистрация: 02.02.2015
Сообщений: 140
08.10.2015, 15:32  [ТС]     HttpUrlConnection #9
Alex Ziko, точно, перед отправкой Bitmap вывожу в imageView
Alex Ziko
2 / 2 / 1
Регистрация: 27.07.2015
Сообщений: 32
08.10.2015, 15:52     HttpUrlConnection #10
тогда только логи...
Ssnake707
8 / 8 / 6
Регистрация: 02.02.2015
Сообщений: 140
08.10.2015, 16:02  [ТС]     HttpUrlConnection #11
Alex Ziko, где вызвать логи, для того что бы понять ошибку, просто я уже всё перепробовал и "глаза замыленные"
YuraAAA
1566 / 1308 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
08.10.2015, 16:08     HttpUrlConnection #12
Цитата Сообщение от Alex Ziko Посмотреть сообщение
может быть лучше POST заюзать для отправки json?
Это и есть пост
Цитата Сообщение от Ssnake707 Посмотреть сообщение
ttp.setDoOutput(true);
автоматически преобразует в пост
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 651
08.10.2015, 16:09     HttpUrlConnection #13
Ssnake707, там где у тебя catch срабатывает. Вместо
Java
1
Log.d("JSON","тут срабатывает catch");
напиши

Java
1
Log.d("JSON", e.toString());
Ssnake707
8 / 8 / 6
Регистрация: 02.02.2015
Сообщений: 140
08.10.2015, 16:26  [ТС]     HttpUrlConnection #14
Mikalai, Вот что вывел android.os.NetworkOnMainThreadException
Это исключение, когда приложение пытается выполнить операцию сети на своей основной нити.
Может дело в том, что я поток не правильно вызываю.
Java
1
2
Thread http = new goRest(jsonObject,bos.toByteArray());
                        http.run();
вместо этого написал
Java
1
2
Thread http = new goRest(jsonObject,bos.toByteArray());
                        http.start();
тогда приложение падает, последнее что срабатывает это
Java
1
2
3
4
5
finally {
                if (http != null) {
                    http.disconnect();
                    Log.d("JSON","finally");
                }
Добавлено через 15 минут
Как выяснилось приложение падает из за DataOutStream
Логи ошибки
Java
1
2
3
4
10-08 19:24:51.604  28178-29721/com.ssnake.testcamera E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-30721
    Process: com.ssnake.testcamera, PID: 28178
    java.lang.ClassCastException: com.android.okhttp.internal.http.HttpTransport$ChunkedOutputStream cannot be cast to java.io.DataOutputStream
            at com.ssnake.testcamera.MainActivity$goRest.run(MainActivity.java:188)
Тогда возникает вопрос, как мне передать массив byte[] в rest?
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 651
08.10.2015, 16:33     HttpUrlConnection #15
ну так перед finally вставь
Java
1
2
3
catch (Exception e) {
Log.d("JSON", e.toString());
}
Добавлено через 5 минут
Ssnake707, отправляй пост запрос иначе. Например так.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2015, 16:44     HttpUrlConnection
Еще ссылки по теме:

Как отправить данные json через HttpURLConnection - Программирование Android
Здравствуйте! Мне нужно работать с АПИ из приложения. Использую HttpURLConnection URL url = new URL(apiHost); ...

HttpURLConnection - Java Сети
С помощью класса HttpURLConnection записываю данные и передаю POST запрос, после этого закрываю соединение, но мне нужно сделать так раз...

HttpURLConnection - Мобильные ОС
Здравствуйте.Столкнулся с такой проблемой, помогите пожалуйста. Есть такой код: //есть ссыка...передается сюда private InputStream...

HttpURLConnection + POST - Java Сети
Здравствуйте. Подскажите пожалуйста, как правильно передать POST запрос который я привел в HTML но нужно такой же сформировать в Java ...

Проверка HttpURLConnection - Java
Здравствуйте еще раз, вот код из примера делаю все также, а пишет ошибку /* * To change this template, choose Tools | Templates ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ssnake707
8 / 8 / 6
Регистрация: 02.02.2015
Сообщений: 140
08.10.2015, 16:44  [ТС]     HttpUrlConnection #16
Mikalai, Если честно, то хочется разобраться именно с этим.

Добавлено через 8 минут
Интересует еще один вопрос, я отправил данные на rest и он мне должен вернуть ответ, как прочитать данный ответ, то как я это реализовал выкидывает ошибку "java.io.FileNotFoundException: http://eip.geoportal.kz:8080/eip/api"
Yandex
Объявления
08.10.2015, 16:44     HttpUrlConnection
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru