我有一段代码使用RxJava zip()
运算符同时执行对REST API的两次独立调用:
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Observable<List<Player>> obs_players = RestAPI.getApi().getService()
.getAllPlayers(LoggedUser.getInstance().getToken());
Observable<List<Game>> obs_games = null;
// first id corresponds to ALL players
if (id == 0){
obs_games = RestAPI.getApi().getService()
.getAllGames();
}
// get the player's id
else{
int player_id = (int)liste_players.get((int)id - 1).getId();
obs_games = RestAPI.getApi().getService().getGamesSingleUser(player_id);
}
// Parallely get all users and required games to be displayed
Observable<Pair<List<Game>, List<Player>>> obs_combined = null;
obs_combined.zip(obs_games, obs_players, (l_g, l_p)->
new Pair<>(l_g, l_p))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Pair<List<Game>, List<Player>>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.d("DBG", "onSubscribe - onItemSelected");
}
@Override
public void onNext(@NonNull Pair<List<Game>, List<Player>> listListPair) {
Log.d("DBG", "onNext - onItemSelected");
// loop over games
for (Game g: listListPair.first){
// loop over PlayerInGame
for (PlayerInGame pig: g.getListe_joueurs()){
pig.setPlayer(
Collections2.filter(listListPair.second,
player-> player.getId()==pig.getPlayer()
.getId())
.iterator()
.next()
);
}
}
liste_match = listListPair.first;
expandable_list_adapter.setData(liste_match);
expandable_list_adapter.notifyDataSetChanged();
}
@Override
public void onError(@NonNull Throwable e) {
Log.d("", "onError");
}
@Override
public void onComplete() {
Log.d("DBG", "onComplete - onItemSelected");
}
});
虽然它可以在不引发任何错误的情况下工作,但在服务器端,我注意到与GET
相关的obs_games
方法被调用了两次,第二个方法成功了:
[27/Sep/2017 20:49:01] "GET /users/3/games HTTP/1.1" 301 0
[27/Sep/2017 20:49:01] "GET /users/3/games/ HTTP/1.1" 200 537
[27/Sep/2017 20:49:01] "GET /users/ HTTP/1.1" 200 451
我检查过onSubscribe()
,onNext()
和onComplete()
方法被调用一次,所以我不知道这个问题可能来自哪里。
答案 0 :(得分:2)
HTTP响应代码301是重定向。
您的客户端代码正在调用该服务以获取&#34; / users / 3 / games&#34;。在服务器端,某些东西(可能是代码周围的框架)正在识别路径不正确。作为一个目录,框架期待一个尾随&#34; /&#34;。
所以服务器发回301,表明你想要的东西已经移动了#34;到&#34; / users / 3 / games /&#34; (注意尾随&#34; /&#34;)。
此时,客户端(可能是您正在使用的框架/接口)看到地址已更改并向服务器发出另一个GET(带有更正的地址)。
在第二次调用时,执行预期的服务器端功能,并以200(成功)响应。