2017-01-12 10 views
0

Я очень новичок в RxJava, и я все еще пытаюсь понять поток данных, но я хочу знать, возможно ли это, прежде чем отправиться в глубь кроличьей дыры.Клиент Джерси RxJava и коллекция конечных точек ресурсов

Цель: разъединить API ресурсов и позволяют им распространяться, а также обеспечивает гибкость для клиентов (веб/мобильных) для выборки данных на основе HREF ссылки, представленные только несколько «известных» API конечные точки.

У меня есть коллекция объектов JSON из одного API, где каждый json имеет поле «href», которое предоставляет ссылку на ресурс API, где можно получить полную информацию о данных. Например:

{ 
    { 
     name: "assassins_creed", 
     href: "games/assassins_creedId123" 
    }, 
    { 
     name: "bioshock", 
     href: "games/bioshockId456" 
    }, 
    { 
     name: "clean_code", 
     href: "books/clean_codeId789" 
    }, 
    { 
     name: "christmas", 
     href: "events/xmas001" 
    } 
} 

После получения этой коллекции, я хотел бы сделать вызов на соответствующий ресурс, используя этот Href значение и сохранить результат в коллекции, такие как массив JSON.

Я сопоставляю строки из списка объектов JSON в другой список, тогда я пытаюсь добавить их в наблюдаемый, чтобы асинхронно получать каждый ресурс в один и тот же ответ.

Я использую Jersey example в качестве ссылки, и я обеспокоен тем, что он не может использовать динамические ссылки href и возвращать ответ, который я бы хотел.

До сих пор я остановился на:

@Override 
public List<JSONObject> getUsersDashboard(TokenModel token, String userId, @Suspended final AsyncResponse async) { 
    List<JSONObject> list = //Database request to get items for userId 
    List<String> hrefLinks = list.stream() 
      .map(e -> (String) e.get("href")) 
      .collect(Collectors.toList()); 

    final Queue<String> errors = new ConcurrentLinkedQueue<>(); 

    Observable.just(new JSONArray()) 
      .zipWith(dashboard(token.getAccessToken(),"plhUrl", errors), (array, objects) -> { 
       array.add(objects); 
       return array; 
      }) 
      .subscribe(response -> { 
       //errors? 
       async.resume(response); 
      }, async::resume); 
} 

private Observable<List<JSONObject>> dashboard(String access, String urlFragment, Queue<String> errors) { 
    Client client = ClientBuilder.newClient(); 
    return RxObservable.from(client).target(urlFragment).request() 
      .header("Authorization", access) 
      .rx() 
      .get(new GenericType<List<JSONObject>>(){}) 
      .onErrorReturn(throwable -> { 
       errors.offer(throwable.getMessage()); 
       return Collections.emptyList(); 
      }); 
} 

Я был колеблющимся, чтобы поместить это в цикл для создания Наблюдаемые для каждой записи hrefLinks.

Как я могу получить ответы от нескольких ресурсов на один когерентный ответ для клиента?

ответ

0

flatMap Операция - это то, что вы ищете. Вы можете выделять ссылки href в потоке, чтобы в операторе flatMap вы преобразовывали каждую ссылку в новую наблюдаемую, которая передает результат в исходный поток. Я думаю, что это именно то поведение, которое вы описали.

EDIT: Библиотека дооснащения обеспечивает приятный интерфейс для создания наблюдаемых ссылок. Чтобы подробнее рассказать о вашем примере, вам сначала нужно преобразовать объект коллекции в какой-то Iterable с помощью оператора map. После того, как у вас есть interable, используйте flatMap, чтобы создать наблюдаемые элементы, принадлежащие Iterable, с помощью Observable.from(). Это приведет к тому, что ссылки станут отдельными выбросами. Затем вы снова используете flatMap, чтобы преобразовать каждую ссылку в наблюдаемый сетевой запрос, который перенаправляет эмиссию обратно в исходный поток.

getCollectionObjectObservable() 
    .map(result -> iterable) // transform the object into Iterable(ie. List) 
    .flatMap(iterable -> Observable.from(iterable)) 
    .flatMap(link -> createRequestObservable(link)) 
    .subscribe(result -> /* process the result of each item here */) 
+0

getCollectionObjectObservable(): это метод в библиотеке дооснащения? – fakataha

+0

После некоторой работы и помощи у меня есть работа, спасибо! – fakataha

Смежные вопросы