使用代码301和200调用两次GET方法

时间:2017-09-27 20:58:25

标签: java android retrofit rx-java

我有一段代码使用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()方法被调用一次,所以我不知道这个问题可能来自哪里。

1 个答案:

答案 0 :(得分:2)

HTTP响应代码301是重定向。

您的客户端代码正在调用该服务以获取&#34; / users / 3 / games&#34;。在服务器端,某些东西(可能是代码周围的框架)正在识别路径不正确。作为一个目录,框架期待一个尾随&#34; /&#34;。

所以服务器发回301,表明你想要的东西已经移动了#34;到&#34; / users / 3 / games /&#34; (注意尾随&#34; /&#34;)。

此时,客户端(可能是您正在使用的框架/接口)看到地址已更改并向服务器发出另一个GET(带有更正的地址)。

在第二次调用时,执行预期的服务器端功能,并以200(成功)响应。