您好我在我的应用中使用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);
}
答案 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调用解决了我的问题。