對response進行解密捞高,retrofit設(shè)置自定義的ConverterFactory氯材,因客戶端與服務(wù)端使用json通信,因此我們參考官方提供GsonConverterFactory編寫
Retrofit retrofit = new Retrofit.Builder()
.client(getOkHttpClient())
.addConverterFactory(CustomGsonConverterFactory.create())
.baseUrl(BASE_URL)
.build();
class CustomGsonResponseConverter<T> implements Converter<ResponseBody, T> {
private final Gson gson;
private final TypeAdapter<T> adapter;
CustomGsonResponseConverter(Gson gson, TypeAdapter<T> adapter) {
this.gson = gson;
this.adapter = adapter;
}
@Override
public T convert(ResponseBody value) throws IOException {
try {
String originalBody = value.string();
// 解密
String body = EncryptUtils.decryptParams(originalBody);
// 獲取json中的code硝岗,對json進行預(yù)處理
JSONObject json = new JSONObject(body);
int code = json.optInt("code");
// 當code不為0時氢哮,設(shè)置data為{},這樣轉(zhuǎn)化就不會出錯了
if (code != 0) {
json.put("data", new JSONObject());
body = json.toString();
}
return adapter.fromJson(body);
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
} finally {
value.close();
}
}
class GsonRequestBodyConverter<T> implements Converter<T, RequestBody> {
private static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8");
private static final Charset UTF_8 = Charset.forName("UTF-8");
private final Gson gson;
private final TypeAdapter<T> adapter;
GsonRequestBodyConverter(Gson gson, TypeAdapter<T> adapter) {
this.gson = gson;
this.adapter = adapter;
}
@Override public RequestBody convert(T value) throws IOException {
Buffer buffer = new Buffer();
Writer writer = new OutputStreamWriter(buffer.outputStream(), UTF_8);
JsonWriter jsonWriter = gson.newJsonWriter(writer);
adapter.write(jsonWriter, value);
jsonWriter.close();
return RequestBody.create(MEDIA_TYPE, buffer.readByteString());
}
}
image
借鑒原文https://blog.csdn.net/weixin_43901866/article/details/86578148