Неразрешенное исключение хоста Android

Я пытаюсь вызвать веб-службу RESTful из приложения Android, используя следующий метод:

HttpHost target = new HttpHost("http://" + ServiceWrapper.SERVER_HOST,ServiceWrapper.SERVER_PORT);
HttpGet get = new HttpGet("/list");
String result = null;
HttpEntity entity = null;
HttpClient client = new DefaultHttpClient();
try {
    HttpResponse response = client.execute(target, get);
    entity = response.getEntity();
    result = EntityUtils.toString(entity);
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if (entity!=null)
        try {
            entity.consumeContent();
        } catch (IOException e) {}
}
return result;

Я могу перейти по адресу и просмотреть результаты xml с помощью браузера эмулятора Android и с моей машины. Я дал своему приложению разрешение INTERNET.

Я развиваюсь с eclipse.

Я видел упоминание о том, что мне может потребоваться настроить прокси, но поскольку веб-служба, которую я вызываю, находится на порту 80, это не должно иметь значения, не так ли? Я могу вызвать метод с помощью браузера.

Любые идеи?


person Rob Stevenson-Leggett    schedule 14.06.2009    source источник
comment
Настройки прокси не будут иметь значения, если ваше устройство не находится за прокси-сервером.   -  person Jeremy Logan    schedule 15.06.2009
comment
Вот о чем я думал. Я все еще не могу заставить это работать.   -  person Rob Stevenson-Leggett    schedule 16.06.2009


Ответы (4)


Я думаю, что проблема может быть в первой строке:

new HttpHost("http://" + ServiceWrapper.SERVER_HOST,ServiceWrapper.SERVER_PORT);

Конструктор HttpHost ожидает в качестве первого аргумента имя хоста, а не имя хоста с префиксом "http://".

Попробуйте удалить "http://", и это должно сработать:

new HttpHost(ServiceWrapper.SERVER_HOST,ServiceWrapper.SERVER_PORT);
person Josef Pfleger    schedule 18.06.2009

Ошибка означает, что URL-адрес не может быть разрешен через DNS. Есть много проблем, которые могут вызвать это. Если вы сидите за прокси-сервером, вы должны настроить его для использования.

HttpHost proxy = new HttpHost(”proxy”,port,”protocol”);
client.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);

Также убедитесь, что ваше интернет-разрешение выглядит так

<uses-permission android:name=”android.permission.INTERNET”></uses-permission>

Так как иногда он не будет работать как пустой тег.

Также ознакомьтесь с разделом Emulator Network и разделом ограничений.

person jitter    schedule 14.06.2009
comment
Я не уверен в настройках прокси, так как я нажимаю только порт 80, а браузер эмулятора может вызывать веб-сервис. - person Rob Stevenson-Leggett; 16.06.2009
comment
Это помогло мне при использовании обычного HttpGet(http://host/path); - Кажется, Eclipse не вставляет этот XML-тег. Спасибо! - person ndrix; 18.02.2011
comment
‹uses-permission android:name="android.permission.INTERNET"›‹/uses-permission› у меня тоже сработало. - person dan gibson; 27.10.2011

Я бы дважды проверил, правильно ли установлено сетевое разрешение. Попробуйте что-нибудь простое, например

String address -"http://www.google.com";
URL url = new URL(address);             
InputStream in = url.openStream();

чтобы убедиться, что у вас правильно настроены разрешения.

После этого используйте свой любимый анализатор протоколов (я фанат wireshark), чтобы выяснить, отправляете ли вы правильные пакеты. Я считаю, что вам нужно передать полный URL-адрес HTTPGet, но я уверен только примерно на 80%.

person hacken    schedule 17.06.2009
comment
Верно, я могу вернуть данные, используя этот метод. Однако я не могу понять, почему исходный код не работает. Я тоже ничего не вижу в Fiddler! - person Rob Stevenson-Leggett; 18.06.2009
comment
Является ли этот метод допустимым способом вызова веб-службы REST? т.е. потребляя входной поток в строку? - person Rob Stevenson-Leggett; 18.06.2009
comment
Это очень простой метод, но его может быть достаточно в зависимости от того, что вы делаете. Я не знаком с fiddler, но я не уверен, что это то же самое, что и анализатор пакетов. Я предполагаю, что URL-адрес или хост неверны. Я бы попробовал передать полный URL-адрес (http:// + ServiceWrapper.SERVER_HOST+//list) и посмотреть, поможет ли это. - person hacken; 18.06.2009
comment
Fiddler — это прокси-сервер веб-отладки (т. е. прокси-сервер HTTP, используемый для анализа трафика HTTP) и, следовательно, не анализатор пакетов. - person Josef Pfleger; 18.06.2009

Измените первую строку в вашем коде:

HttpHost(ServiceWrapper.SERVER_HOST,ServiceWrapper.SERVER_PORT);
person SRY    schedule 15.11.2012