Один из подходов (похожих на подход Винни) заключается в локальной реализации вашего веб-сервиса. Например, ваш веб-сервис позволяет вам войти в систему и получить список пользователей онлайн.
Интерфейс веб-сервиса выглядит следующим образом:
public interface WebService {
public LoginResponse login(String user, String pass) throws Exception;
public UsersOnlineResponse getOnlineUsers() throws Exception;
}
Затем мы реализуем этот интерфейс для удаленного веб-сервиса, который будет использоваться в производстве. Удаленная реализация выполняет HTTP-вызовы с помощью HTTP-клиента, получает ответ и анализирует его для соответствующего объекта ответа. Вот фрагмент этого:
public class RemoteWebService implements WebService {
private AndroidHttpClient client = AndroidHttpClient.newInstance(USER_AGENT);
@Override
public LoginResponse login(String user, String pass) throws Exception {
LoginResponse response = client.execute(
createPostRequest(METHOD_LOGIN, user, pass),
new JsonResponseHandler(LoginResponse.class));
handleResponse(response); // verify response, throw exceptions if needed
return response;
}
}
В целях тестирования, когда веб-сервис недоступен или разрабатывается, мы внедряем локальный веб-сервис. Локальная реализация берет предопределенные ответы JSON из папки активов и анализирует их для соответствующего объекта ответа. Вам решать, как реализовать поведение веб-сервиса: это могут быть простые статические ответы или некоторые случайные / зависящие от проверки ответы. Вот часть этого:
public class LocalWebService implements WebService {
private Context context;
public LocalWebService(Context context) {
this.context = context;
}
@Override
public LoginResponse login(String user, String pass) throws Exception {
Thread.sleep(DELAY); //emulate network delay
if (validateParams(user, pass)) {
return parseAssetsJson("ws/login.json", LoginResponse.class);
} else {
Response response = parseAssetsJson("ws/status_bad_request.json", Response.class);
throw new WebServiceException(response);
}
}
public <T> T parseAssetsJson(String filename, Class<T> klass) throws IOException {
InputStream is = context.getAssets().open(filename);
return JsonParser.getInstance().fromJson(new InputStreamReader(is), klass);
}
}
Далее мы хотим безболезненно переключаться между реализациями. Использование обеих реализаций веб-сервиса прозрачно, потому что мы используем интерфейс WebService. Итак, мы настроим экземпляр WebService при запуске приложения. Приложение Класс соответствует нашим потребностям:
public class App extends Application {
public static final boolean USE_LOCAL_WS = false;
private static WebService webService;
public static getWebService() {
return webService;
}
@Override
public void onCreate() {
super.onCreate();
webService = USE_LOCAL_WS ? new LocalWebService(this) : new RemoteWebService();
}
}