需要获取响应消息,同时在 Retrofit 中出现 400 错误,Android

Need to get the response message, while getting 400 error in Retrofit, Android

我收到以下响应,同时出现 400 错误。

  {"unit":"You may not create job for other than your unit!"}

    2021-06-08 17:15:33.715 8599-8752/com.fyxtpmtenant I/okhttp.OkHttpClient: <-- 400 https://myserver.com/v1/jobs/ (131ms)
2021-06-08 17:15:33.715 8599-8752/com.fyxtpmtenant I/okhttp.OkHttpClient: date: Tue, 08 Jun 2021 11:45:35 GMT
2021-06-08 17:15:33.715 8599-8752/com.fyxtpmtenant I/okhttp.OkHttpClient: content-type: application/json
2021-06-08 17:15:33.715 8599-8752/com.fyxtpmtenant I/okhttp.OkHttpClient: content-length: 59
2021-06-08 17:15:33.715 8599-8752/com.fyxtpmtenant I/okhttp.OkHttpClient: server: nginx/1.18.0 (Ubuntu)
2021-06-08 17:15:33.715 8599-8752/com.fyxtpmtenant I/okhttp.OkHttpClient: vary: Accept, Origin
2021-06-08 17:15:33.715 8599-8752/com.fyxtpmtenant I/okhttp.OkHttpClient: allow: GET, POST, HEAD, OPTIONS
2021-06-08 17:15:33.715 8599-8752/com.fyxtpmtenant I/okhttp.OkHttpClient: x-frame-options: DENY
2021-06-08 17:15:33.715 8599-8752/com.fyxtpmtenant I/okhttp.OkHttpClient: x-content-type-options: nosniff
2021-06-08 17:15:33.715 8599-8752/com.fyxtpmtenant I/okhttp.OkHttpClient: referrer-policy: same-origin
2021-06-08 17:15:33.716 8599-8752/com.fyxtpmtenant I/okhttp.OkHttpClient: {"unit":"You may not create job for other than your unit!"}
2021-06-08 17:15:33.716 8599-8752/com.fyxtpmtenant I/okhttp.OkHttpClient: <-- END HTTP (59-byte body)

我需要向用户显示我在 400 错误响应中得到的信息。响应可能会改变。我尝试了以下

 JSONObject msgObj = new JSONObject(String.valueOf(response.raw()));

但是得到如下错误

org.json.JSONException: Value Response of type java.lang.String cannot be converted to JSONObject

编辑: 我尝试了以下方法来获得响应:

 Log.e("error body 1>",response.errorBody()+" ");
  Log.e("error body 2>",response.body()+" ");
  Log.e("error body 3>",response.toString()+" ");
  Log.e("error body 4>",response.message()+" ");
  Log.e("error body 8>",response.raw()+" ");

得到这个:

error body 1>: okhttp3.ResponseBody$Companion$asResponseBody@d2d0fcc 
error body 2>: null 
error body 3>: Response{protocol=h2, code=400, message=, url=https://c1.myserver.com/v1/jobs/} 
error body 4>:  
error body 8>: Response{protocol=h2, code=400, message=, url=https://c1.myserver.com/v1/jobs/} 

尝试使用它来将您的响应映​​射到 API:

提供的错误格式
public static ErrorDTO parseError(Retrofit retrofit, Response<?> response) {
    Converter<ResponseBody, ErrorDTO> converter = retrofit.responseBodyConverter(ErrorDTO.class, new Annotation[0]);

    ErrorDTO error;

    try {
        error = converter.convert(response.errorBody());
    } catch (IOException e) {
        return new ErrorDTO();
    }

    return error;
}

ErrorDTO 应该是一个简单的 POJO,它与错误响应的主体结构相匹配。