Страница 1 из 1
запрос - ответ
Добавлено: 16 окт 2012, 08:41
psevdo
Приветствую. Уже несколько дней бьюсь над задачей. Помогите пожалуйста разобраться. Мне нужно обратиться к скрипту, отправить ему 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());
}
Дал приложению разрешение на доступ к интернету. При запуске приложения пишет, что не может соединиться с сервером.
Re: запрос - ответ
Добавлено: 16 окт 2012, 10:21
rezak90
есть ли интернет на самом эмуляторе?
лучше скиньте лог ошибок.
Re: запрос - ответ
Добавлено: 16 окт 2012, 10:23
psevdo
Приложение запускаю уже на самом девайсе. Интернет запущен. Исключение происходит в первом try. На экран выводится:
Error in http connection
NetworkOnMainThreadException
Re: запрос - ответ
Добавлено: 16 окт 2012, 10:50
rezak90
NetworkOnMainThreadException
вы заходили на developer.android.com и смотрели описание ошибки?
Начиная с 3.0 андроида все сетевые операции должны быть в отдельном потоке, что и есть правильно, лишняя проверка для разрабов и напоминалка
Re: запрос - ответ
Добавлено: 16 окт 2012, 10:55
psevdo
rezak90 писал(а):NetworkOnMainThreadException
вы заходили на developer.android.com и смотрели описание ошибки?
Начиная с 3.0 андроида все сетевые операции должны быть в отдельном потоке, что и есть правильно, лишняя проверка для разрабов и напоминалка
Пардон. Это мое первое приложение на андроиде. Поэтому не знаю еще куда лезть и смотреть. Что вообще означает данная ошибка? Подскажите пожалуйста. И как вообще выровнять ситуацию?
Re: запрос - ответ
Добавлено: 16 окт 2012, 10:59
rezak90
Это значит что любая сетевая операция должна выполнятся в отдельном потоке (о потоках есть на этом сайте уроки, а именно про AsyncTask или про Handler).
Re: запрос - ответ
Добавлено: 04 янв 2013, 13:34
dcbp
Друзья подскажите логику пожалуйста.
Я построил приложение следующим образом:
Есть активити, из него вызывается функция класса для работы с запросами, называется он 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 потоке то весь этот код построен неверно, так как это условие
абсолютно бесполезно.
Вот и вопрос. Как бы это сделать так, чтобы от этого условия зависело что-то. И программа продолжала работать в активити, например, чтобы в зависимости от ответа сервера вызывалась та или иная функция в активити? Или это в корне неправильное мышление? я ещё никак не могу на java мышление переключиться)
Re: запрос - ответ
Добавлено: 14 янв 2013, 10:32
damager82
dcbp писал(а):Вот и вопрос. Как бы это сделать так, чтобы от этого условия зависело что-то. И программа продолжала работать в активити, например, чтобы в зависимости от ответа сервера вызывалась та или иная функция в активити? Или это в корне неправильное мышление? я ещё никак не могу на java мышление переключиться)
Как вариант 1, можно передавать handler в эту функцию и потом в Activity ловить сообщения. (Урок 80 и дальше)
Как вариант 2, можно передавать ссылку на Activity в эту функцию и потом из функции делать callback. (в Уроке 106 есть похожий пример)
Re: запрос - ответ
Добавлено: 19 янв 2013, 02:57
sergios.83
Друзья, пожалуйста, нужна помощь: Пытаюсь взять данные с 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 то никак не могу заполучить данные.
Кто знает, помогите
Re: запрос - ответ
Добавлено: 19 янв 2013, 15:06
rezak90
я что то не совсем понял, в первом посте обращаетесь к одному сайту, в последнем уже к другому, так куда вам нужно сделать запрос и что нужно получить?
Re: запрос - ответ
Добавлено: 22 янв 2013, 15:49
damager82
А ошибку никакую не выдает? Он по идее должен ругаться, что хост пустой, из-за того, что в хосте есть символ подчеркивания.
Используйте IP-адрес, либо попробуйте другую библиотеку для работы с http. Правда, ХЗ, какие из них поймут символ "_"
Re: запрос - ответ
Добавлено: 22 янв 2013, 20:19
sergios.83
Проблемма решилась переносом в другой freeHosting. хз почему так получилось...(делал запрос и через IP)
Где то я читал, что с 2011 года Google Android перестал поддерживать такого вида Http запросы.
Для адэкватной работы в самом деле лучше использовать другую библиотеку...(метод)