改造错误身体奇怪的行为

时间:2017-08-19 15:38:44

标签: java android json retrofit

如果我写:

String str = response.errorBody().string();
String errors = Misc.get_errors(str);

一切正常(get_errorsfinal static方法,只重新格式化str)。

但是,如果我直接写:

String errors = Misc.get_errors(response.errorBody().string());

失败了。

我的Java有点生疏,我想知道为什么结果不同。

编辑:

public final static String get_errors(String errors) {

        StringBuilder sb = new StringBuilder();

        try {
                JSONObject jObjError = new JSONObject(errors);

                Iterator<String> it = jObjError.keys();

                while (it.hasNext()) {

                    sb.append(jObjError.get(it.next()).toString().replace("[\"", "").replace("\"]", ""));
                    sb.append(System.getProperty("line.separator"));

                }

            } catch (Exception e) {
                e.printStackTrace();

            }



        return sb.toString();


Callback<Joueur> callback = new Callback<Joueur>(){

                                                          @Override
                                                          public void onResponse(Call<Joueur> call, Response<Joueur> response){

                                                              // display message if http error(s)
                                                              if(!response.isSuccessful()){
                                                                  try{
                                                                      String raw_errors = response.errorBody().string();
                                                                      String errors = Misc.get_errors(raw_errors);
                                                                      Toast display = Toast.makeText(getApplicationContext(), errors, Toast.LENGTH_LONG);
                                                                      display.show();
                                                                  }
                                                                  catch(Exception e){
                                                                      e.printStackTrace();
                                                                  }

                                                              }
                                                              // otherwise, launch new intent
                                                              else{

                                                                  Intent myIntent = new Intent(Inscription_activity.this, Connexion_activity.class);
                                                                  Inscription_activity.this.startActivity(myIntent);

                                                              }


                                                              }

2 个答案:

答案 0 :(得分:1)

在使用错误主体(因为它是一个ResponseBody)之后,它将变为空(因为它是一个缓冲区并被消耗)。这就是为什么它只是第一次有效。

如果要复制要使用的响应,可以执行此操作。

val oldResponseBody = it.response().errorBody()
val responseBytes = oldResponseBody.bytes()
val reponseCopy1 = ResponseBody.create(oldResponseBody.contentType(), responseBytes)
val reponseCopy2 = ResponseBody.create(oldResponseBody.contentType(), responseBytes)

请注意,此方法会立即将响应的所有字节复制到内存中。

答案 1 :(得分:0)

获取错误正文的只读副本(在 OkHttp3 版本 4.9.1 上测试):

response()?.errorBody()?.source()?.buffer?.snapshot()?.utf8()