由共享首选项引起的400个错误请求的改进

时间:2016-06-10 10:54:14

标签: java android retrofit

您好我在我的应用中使用retrofit + rxandroid。所以我在这里有链接请求的方法

public void requestToken(String token,String push_token){
    api.getApi().signIn(token,push_token)
            .map(signInModel -> {
                SharedPreferencesHelper.setLoggedIn();
             SharedPreferencesHelper.setCurrentUserToken(signInModel.getData().getToken());//this line cause 400 bad request
                return api.getApi().getUser(signInModel.getData().getToken());
            })
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<User>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {
                    Log.i(TAG, "onError: " + e);
                }

                @Override
                public void onNext(User user) {
                    UserData data = user.getUserdata();

                }
            });

}

无法理解SharedPreferencesHelper.setCurrentUserToken(signInModel.getData().getToken()); 导致400次错误请求改进错误的原因。如果没有它,它就能完美运作。

这是我的api界面

  public interface Api {


        @FormUrlEncoded
        @POST("/auth/digits/signin")
        public Observable<SignInModel>
        signIn(@Field("digits_token") String digits_token, @Field("push_token") String push_token);

        @GET("/user/get")
        public User
        getUser(@Header("Authorization") String authorization_header);
}

2 个答案:

答案 0 :(得分:0)

400听起来就像是从服务器获取的特定错误代码。您可以通过在Retrofit上添加loglevel来尝试调试。

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(NetworkCalls.BASE_URL)
    .client(client)
    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
    .addConverterFactory(GsonConverterFactory.create())
    .setLogLevel(RestAdapter.LogLevel.FULL)              // <--- Add this line
    .build();

使用loglevel,您可能会从服务器上看到一些错误json。

示例:

{"statusCode":400,"message":"Some parameters are missing"}

注意:此完整日志级别是调试目的,我认为您应该禁用它以进行生产发布。

答案 1 :(得分:0)

问题在于requestInterceptor。实际上不知道为什么共享偏好会导致它,但是我发送的Header是错误的

public SapronApi() {

    RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint(BASE_URL)
            .setRequestInterceptor(request -> request.addHeader("Authorization",SharedPreferencesHelper.getToken()))
            .setLogLevel(RestAdapter.LogLevel.FULL)
            .build();
    mApi = restAdapter.create(Api.class);

}


public SapronApi(Boolean dummy){

    RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint(BASE_URL)
            .setLogLevel(RestAdapter.LogLevel.FULL)
            .build();
    mApi = restAdapter.create(Api.class);
}

创建没有静态标头的api调用解决了我的问题。