Клиент рестлета на Android: не может оторваться от земли :(

1

Я немного поиграл с реслитом, и до сих пор мне это нравится:)

У меня возникли проблемы с получением рестлитного клиента для работы с эмулятором Android.

В настоящий момент у вас очень простой сервер рестайла, работающий под JSE. Все, что он делает, это разоблачение корневого ресурса (который на данный момент является только строкой текста) с помощью метода GET. Я могу получить ресурс с помощью браузера, а также с помощью простого клиента-консоли, запущенного в консоли. Я изменил код для JSE-клиента, чтобы попытаться подключиться с помощью эмулятора Android, но я не могу заставить его работать:

package mypackage;

import android.app.Activity;
import android.os.Bundle;

import android.widget.TextView;

import org.restlet.resource.ClientResource;
import org.restlet.representation.Representation;

public class MyActivity extends Activity {

  @Override
  public void onCreate( Bundle savedInstanceState ) {

  super.onCreate( savedInstanceState );

    ClientResource res = new ClientResource( "http://server-ip:8111/" );
    Representation rep = res.get();

    TextView tv = new TextView( this );
    try {
      tv.setText( rep.getText() );
    } catch ( Exception ex ) {
      tv.setText( "Exception: " + ex.getMessage() );
    }
    setContentView( tv );

  }

}

Примечания:

(1) Встроенный браузер на эмуляторе Android может подключаться к веб-службе и извлекать текст.

(2) Файл проекта Manifest.xml был изменен для включения INTERNET в качестве разрешений использования.

(3) Следующий клиент, использующий библиотеку Apache HttpClient, поставляемый в комплекте с Android, отлично работает:

package mypackage;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;

public class TestActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        DefaultHttpClient client = new DefaultHttpClient();
        HttpGet get = new HttpGet( "http://server-ip:8111/" );
        ResponseHandler<String> handler = new BasicResponseHandler();

        TextView tv = new TextView( this );

        try {
            String content = client.execute( get, handler );
            client.getConnectionManager().shutdown();
            setContentView( tv );
            tv.setText( content );
        } catch ( Exception ex ) {
            tv.setText( "Exception: " + ex.getMessage() );
        }

    }

}

Любые идеи, что я могу делать неправильно?

Спасибо заранее,

Майк.

  • 0
    Как «не работает» проявляется? Это исключение? Вернуть что-то, но не то, что вы ожидаете? ...
  • 0
    Извините, я думал, что поместил это в оригинальный пост. Я полагаю, что время ожидания HTTP-запроса истекло. Происходит длительная задержка, а затем на эмуляторе Android появляется окно с сообщением, что приложение неожиданно завершило работу. Я собираюсь использовать веб-отладчик (Чарльз), чтобы проверить, как выглядит запрос, но мне нужно выяснить, как сначала установить прокси в Eclipse>: |
Показать ещё 1 комментарий
Теги:
rest
restlet

1 ответ

2
Лучший ответ

Одним из способов является регистрация расширения org.restlet.ext.httpclient вручную, чтобы заменить внутренний/стандартный HTTP-клиент. См. Руководство пользователя Restlet: http://wiki.restlet.org/docs_2.1/13-restlet/275-restlet/266-restlet.html

Недавние снимки Restlet 2.1 также исправили давнюю проблему с внутренним HTTP-коннектором, который может вызвать неожиданные таймауты.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню