Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 改型2-获取错误对象JSON(相同请求的POJO很少)_Java_Android_Json_Retrofit - Fatal编程技术网

Java 改型2-获取错误对象JSON(相同请求的POJO很少)

Java 改型2-获取错误对象JSON(相同请求的POJO很少),java,android,json,retrofit,Java,Android,Json,Retrofit,我有一个简单的要求,比如 /*LOGIN*/ @FormUrlEncoded @POST("v1/user/login") //your login function in your api Call<LoginResponce> login(@Field("identity") String identity, @Field("password") String password); 或者错误Jso

我有一个简单的要求,比如

  /*LOGIN*/
        @FormUrlEncoded
        @POST("v1/user/login") //your login function in your api
        Call<LoginResponce> login(@Field("identity") String identity,
               @Field("password") String password);
或者错误Json,描述了如果出现错误时的确切错误

{"status":4,"description":"user provided token expired"}
如何处理响应中的错误状态

我试过了,但在原始文本中看不到JSON(不起作用)。这似乎不是个好办法

mCallLoginResponse.enqueue(new Callback<LoginResponce>() {
                @Override
                public void onResponse(Response<LoginResponce> response, Retrofit retrofit) {
                    if (response.isSuccess()) {

                        registerWithToken(response.body().getToken());
                    } else { //some error in responce

                        Gson gson = new GsonBuilder().create();
                        ApiError mApiError = gson.fromJson(response.raw().body().toString(), 
ApiError.class); //Exception here - no JSON in String
                            //todo error handling
                        }
                    }
mCallLoginResponse.enqueue(新回调(){
@凌驾
公共响应(响应、改装){
if(response.issucess()){
registerWithToken(response.body().getToken());
}else{//响应中有错误
Gson Gson=new GsonBuilder().create();
APIRROR MAPIRROR=gson.fromJson(response.raw().body().toString(),
apirerror.class);//此处出现异常-字符串中没有JSON
//todo错误处理
}
}

若要在出现错误代码时访问响应正文,请使用而不是
body()
。此外,在
ResponseBody
上有一个
string
方法,您应该使用它来代替
toString

Gson gson = new GsonBuilder().create();
try {
    ApiError mApiError = gson.fromJson(response.errorBody().string(),ApiError.class); 
} catch (IOException e) {
    // handle failure to read error
}

这会引发IOException.Why?response.errorBody().toString()异常不起作用。我希望它返回响应的原始字符串。是的,
string
可以抛出一个
IOException
,因为主体正在流式处理。当调用
string
时,响应从网络中读取。这是否意味着在非200代码的情况下,改装不会读取主体?我如何从asyn主体的网络中读取响应chronius网络调用?据我所知,在网络连接完成后执行“onResponse”回调。因此,如果改型将发送新请求,这意味着我无法设置“onResponse”在UI线程中,我现在这样做了。这是一个值得关注的问题。深入研究它,您不需要担心主线程上的网络——改型将网络响应读取到缓冲区中,并从缓冲区将其流式传输给您。
Gson gson = new GsonBuilder().create();
try {
    ApiError mApiError = gson.fromJson(response.errorBody().string(),ApiError.class); 
} catch (IOException e) {
    // handle failure to read error
}