2017-10-17 3 views
2

認証ヘッダーで要求を送信しようとしていますが、サーバーがクライアントを識別できないようです。 私はthisチュートリアルを使用して、次のようにインターセプタを実装:私は、サーバーへの認証要求を送信しようとしているときにRetrofit 2を使用してリクエストするヘッダーを追加します

public class AuthenticationInterceptor implements Interceptor { 

private String authId; 
private String authToken; 

public AuthenticationInterceptor(String authId, String authToken) { 
    this.authId = authId; 
    this.authToken = authToken; 
} 

@Override 
public Response intercept(@NonNull Chain chain) throws IOException { 
    Request original = chain.request(); 
    Request.Builder builder = original.newBuilder(); 

    if (authId != null && authToken != null) { 
     Timber.d("adding auth headers for: " + this); 
     builder.header("auth_id", authId) 
       .header("auth_token", authToken); 
    } 

    Request request = builder.build(); 
    return chain.proceed(request); 
    } 
} 

、それはエラー応答409を返すサーバーの男は、私はそれらを欠けていると教えてくれましたparams:(例えば郵便配達で受信された)

“accept”: [ 
     “*/*” 
    ], 
    “accept-encoding”: [ 
     “gzip, deflate” 
    ], 
    “cookie”: [ 
     “PHPSESSID=ah1i1856bkdln5pgmsgjsjtar3" 
    ] 
  • は、私が(hereを参照)Dagger2を使用すると、この問題を引き起こすかもしれないと思ったので、私はokHttpClientを分離しましたが、それはまだ動作しません。

    Retrofit retrofit; 
    OkHttpClient client; 
    AuthenticationInterceptor authenticationInterceptor; 
    HttpLoggingInterceptor loggingInterceptor; 
    
    private void testHeaders() { 
    loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() { 
        @Override 
        public void log(String message) { 
         Timber.i(message); 
        } 
    }); 
    loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
    
    client = new OkHttpClient.Builder() 
         .addInterceptor(loggingInterceptor) 
         .build(); 
    
    retrofit = new Retrofit.Builder() 
         .addConverterFactory(GsonConverterFactory.create()) 
         .client(client) 
         .baseUrl(BuildConfig.SERVER_ADDRESS) 
         .build(); 
    
    retrofit.create(EntrOnline.class).getLoginToken("[email protected]", "XXX").enqueue(new Callback<NewAccount>() { 
        @Override 
        public void onResponse(Call<NewAccount> call, Response<NewAccount> response) { 
    
         authenticationInterceptor = new AuthenticationInterceptor(response.body().getAuthId(), response.body().getAuthToken()); 
    
         client = new OkHttpClient.Builder() 
           .addInterceptor(loggingInterceptor) 
           .addInterceptor(authenticationInterceptor) 
           .build(); 
    
         retrofit = new Retrofit.Builder() 
           .addConverterFactory(GsonConverterFactory.create()) 
           .client(client) 
           .baseUrl(BuildConfig.SERVER_ADDRESS) 
           .build(); 
    
         retrofit.create(EntrOnline.class).getKeys("50022d8a-b309-11e7-a902-0ac451eb0490").enqueue(new Callback<List<NewEkey>>() { 
          @Override 
          public void onResponse(Call<List<NewEkey>> call, Response<List<NewEkey>> response) { 
           Timber.d("Test Api"); 
          } 
    
          @Override 
          public void onFailure(Call<List<NewEkey>> call, Throwable t) { 
    
          } 
         }); 
    
        } 
    
        @Override 
        public void onFailure(Call<NewAccount> call, Throwable t) { 
    
        } 
    }); 
    

    }

ありがとう:

  • は、ここに私の使用法の実装(非常に簡単)です!

  • 答えて

    0
    @Headers("Accept: application/json") 
    @FormUrlEncoded 
    @POST("sendWalletMoney") 
    Call<WalletResponse> sendWalletMoney(@Field("sender") String sender, 
                @Field("receiver") String receiver, 
                @Field("amount") String amount, 
                @Field("trnsx_type") String trnsx_type, 
                @Field("currency") String currency, 
                @Field("module_name") String module_name); 
    
    +0

    このカスタムヘッダーを追加しました。役に立たなかったです。 –

    0

    server issueのように見えます。 彼があなたのインターセプタで話したヘッダを追加することができます。

    builder.addHeader("Accept", "*/*").addHeader("accept-encoding", "gzip, deflate") 
    

    しかし、現在のセッションを追跡するには、Web上でCookieを使用する必要があります。 APIでは必要ないはずです。

    関連する問題