代码之家  ›  专栏  ›  技术社区  ›  floflo29

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

  •  0
  • floflo29  · 技术社区  · 8 年前

    zip()

    @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 回复  |  直到 8 年前
        1
  •  3
  •   JimB    8 年前

    HTTP响应代码301是重定向。

    您的客户端代码正在调用该服务以获取“/用户/3/游戏”。在服务器端,某些东西(可能是围绕代码的框架)正在识别路径不正确。作为目录,框架需要一个尾随“/”。

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