запрос - ответ

Ответить
psevdo
Сообщения: 4
Зарегистрирован: 16 окт 2012, 08:22

запрос - ответ

Сообщение psevdo » 16 окт 2012, 08:41

Приветствую. Уже несколько дней бьюсь над задачей. Помогите пожалуйста разобраться. Мне нужно обратиться к скрипту, отправить ему post параметры и получить json данные.

Код: Выделить всё

//http post
        try{
        	HttpClient httpclient = new DefaultHttpClient();
        	HttpPost httppost = new HttpPost("http://zoomagaz.tmweb.ru/request.php");
        	httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        	HttpResponse response = httpclient.execute(httppost);
        	HttpEntity entity = response.getEntity();
        	is = entity.getContent();
        }catch(Exception e){
        	Toast.makeText(this, "Error in http connection "+e.toString() ,Toast.LENGTH_LONG).show();
        	Log.e("log_tag", "Error in http connection "+e.toString());
        }
        
        //convert response to string
        try{
              //BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
              BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"),8);
              StringBuilder sb = new StringBuilder();
              String line = null;
              while ((line = reader.readLine()) != null) {
                      sb.append(line + "\n");
              }
              is.close();
       
              result=sb.toString();
        }catch(Exception e){
              Log.e("log_tag", "Error converting result "+e.toString());
        }
Дал приложению разрешение на доступ к интернету. При запуске приложения пишет, что не может соединиться с сервером.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: запрос - ответ

Сообщение rezak90 » 16 окт 2012, 10:21

есть ли интернет на самом эмуляторе?
лучше скиньте лог ошибок.
R.id.team
Политика на форуме запрещена

psevdo
Сообщения: 4
Зарегистрирован: 16 окт 2012, 08:22

Re: запрос - ответ

Сообщение psevdo » 16 окт 2012, 10:23

Приложение запускаю уже на самом девайсе. Интернет запущен. Исключение происходит в первом try. На экран выводится:
Error in http connection
NetworkOnMainThreadException

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: запрос - ответ

Сообщение rezak90 » 16 окт 2012, 10:50

NetworkOnMainThreadException
вы заходили на developer.android.com и смотрели описание ошибки? :D
Начиная с 3.0 андроида все сетевые операции должны быть в отдельном потоке, что и есть правильно, лишняя проверка для разрабов и напоминалка ;)
R.id.team
Политика на форуме запрещена

psevdo
Сообщения: 4
Зарегистрирован: 16 окт 2012, 08:22

Re: запрос - ответ

Сообщение psevdo » 16 окт 2012, 10:55

rezak90 писал(а):
NetworkOnMainThreadException
вы заходили на developer.android.com и смотрели описание ошибки? :D
Начиная с 3.0 андроида все сетевые операции должны быть в отдельном потоке, что и есть правильно, лишняя проверка для разрабов и напоминалка ;)
Пардон. Это мое первое приложение на андроиде. Поэтому не знаю еще куда лезть и смотреть. Что вообще означает данная ошибка? Подскажите пожалуйста. И как вообще выровнять ситуацию?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: запрос - ответ

Сообщение rezak90 » 16 окт 2012, 10:59

Это значит что любая сетевая операция должна выполнятся в отдельном потоке (о потоках есть на этом сайте уроки, а именно про AsyncTask или про Handler).
R.id.team
Политика на форуме запрещена

dcbp
Сообщения: 24
Зарегистрирован: 26 ноя 2012, 10:34

Re: запрос - ответ

Сообщение dcbp » 04 янв 2013, 13:34

Друзья подскажите логику пожалуйста.
Я построил приложение следующим образом:
Есть активити, из него вызывается функция класса для работы с запросами, называется он Api. В этом классе есть функция login.
а вот уже в этой функции уже в отдельном потоке как раз и происходит запрос к серверу.
выглядит это всё вот так:
в активити:

Код: Выделить всё

case R.id.loginBtn:
	 String login = ((EditText) findViewById(R.id.login)).getText().toString();
	 String password = ((EditText) findViewById(R.id.password)).getText().toString();
	  				
	  if(login.length() > 0 && password.length() > 0)
	  {
	  	if(api.login(login, password)){
	  		Log.d(TAG , "YES");
	  	}
	  	else
	  	{
	  	    Log.d(TAG , "      ---         "+api.getError());
	  	}
	  }
	  else
	  {
	  	Toast.makeText(Auth.this, R.string.error_login, Toast.LENGTH_LONG).show();
	  }
в классе апи функция login возвращает true или false.
Всё работает, с кодом проблем нет. Проблема с логикой.
Естественно раз запрос выполняется в отдельном от UI потоке то весь этот код построен неверно, так как это условие

Код: Выделить всё

if(api.login(login, password))
абсолютно бесполезно.

Вот и вопрос. Как бы это сделать так, чтобы от этого условия зависело что-то. И программа продолжала работать в активити, например, чтобы в зависимости от ответа сервера вызывалась та или иная функция в активити? Или это в корне неправильное мышление? я ещё никак не могу на java мышление переключиться)

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: запрос - ответ

Сообщение damager82 » 14 янв 2013, 10:32

dcbp писал(а):Вот и вопрос. Как бы это сделать так, чтобы от этого условия зависело что-то. И программа продолжала работать в активити, например, чтобы в зависимости от ответа сервера вызывалась та или иная функция в активити? Или это в корне неправильное мышление? я ещё никак не могу на java мышление переключиться)
Как вариант 1, можно передавать handler в эту функцию и потом в Activity ловить сообщения. (Урок 80 и дальше)
Как вариант 2, можно передавать ссылку на Activity в эту функцию и потом из функции делать callback. (в Уроке 106 есть похожий пример)
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

sergios.83
Сообщения: 3
Зарегистрирован: 15 окт 2012, 01:06

Re: запрос - ответ

Сообщение sergios.83 » 19 янв 2013, 02:57

Друзья, пожалуйста, нужна помощь: Пытаюсь взять данные с freeHostinga где я зарегестрировался и загрузил базу.
Мой код...

HttpParams param = new BasicHttpParams();
HttpProtocolParams.setContentCharset(param, "UTF-8");
HttpProtocolParams.setHttpElementCharset(param, "UTF-8");
HttpClient httpclient = new DefaultHttpClient();

httpclient.getParams().setParameter("http.protocol.version", HttpVersion.HTTP_1_1);
httpclient.getParams().setParameter("http.socket.timeout", new Integer(2000));
httpclient.getParams().setParameter("http.protocol.content-charset", "UTF-8");
HttpPost httppost = new HttpPost("http://sergios_greece.500mb.net/Leva/logins.php");

UrlEncodedFormEntity form;
form = new UrlEncodedFormEntity(nameValuePairs, "UTF-8");
form.setContentEncoding(HTTP.UTF_8);
httppost.setEntity(form);
HttpResponse response = httpclient.execute(httppost);
str = EntityUtils.toString(response.getEntity());

Str мне возвращает пустой почему-то..хотя если обратиться через URL к >> http://sergios_greece.500mb.net/Leva/logins.php
мне возвращает строку.
Код рабочий. если работать на локалхосте и брать данные из базы что на локалхосте..тто все берётся.Если же с FreeHosting то никак не могу заполучить данные.
Кто знает, помогите :(

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: запрос - ответ

Сообщение rezak90 » 19 янв 2013, 15:06

я что то не совсем понял, в первом посте обращаетесь к одному сайту, в последнем уже к другому, так куда вам нужно сделать запрос и что нужно получить?
R.id.team
Политика на форуме запрещена

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: запрос - ответ

Сообщение damager82 » 22 янв 2013, 15:49

А ошибку никакую не выдает? Он по идее должен ругаться, что хост пустой, из-за того, что в хосте есть символ подчеркивания.
Используйте IP-адрес, либо попробуйте другую библиотеку для работы с http. Правда, ХЗ, какие из них поймут символ "_"
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

sergios.83
Сообщения: 3
Зарегистрирован: 15 окт 2012, 01:06

Re: запрос - ответ

Сообщение sergios.83 » 22 янв 2013, 20:19

Проблемма решилась переносом в другой freeHosting. хз почему так получилось...(делал запрос и через IP)
Где то я читал, что с 2011 года Google Android перестал поддерживать такого вида Http запросы.
Для адэкватной работы в самом деле лучше использовать другую библиотеку...(метод)

Ответить