Retrofit请求成功数据错误统一拦截后抛自定义异常后,异步调用获取服务器返回来的错误信息

时间久了容易忘记。网上这一块资料不多很多不能用,自己摸索着写出来的,这里做个笔记方便以后查看。
项目用的mvp+rxjava+retrofit 但是某些地方特别简单的接口调用没必要创建很多文件加上时间太紧,就直接用retrofit异步请求了。

这是封装的拦截器的一部分代码。统一拦截状态码不为0 抛出自定义异常

public class CustomizeGsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {

    private final Gson gson;
    private final TypeAdapter<T> adapter;

    CustomizeGsonResponseBodyConverter(Gson gson, TypeAdapter<T> adapter) {
        this.gson = gson;
        this.adapter = adapter;
    }

    @Override
    public T convert(ResponseBody value) throws IOException {
        //把responsebody转为string
        String response = value.string();

        BaseBean baseResponse = gson.fromJson(response, BaseBean.class);
         // 这里只是为了检测code是否!=1,所以只解析HttpStatus中的字段,因为只要code和message就可以了
        if (baseResponse.getCode() != 0) {
            value.close();
            //抛出一个RuntimeException, 这里抛出的异常会到subscribe的onError()方法中统一处理
            throw new MyThrowable(baseResponse.getMsg(), baseResponse.getCode());
        }
        try {
            return adapter.fromJson(response);
        } finally {
            value.close();
        }
    }
}

正常用的时候异常信息传递给Observer 收到后presenter 调用view 失败的方法。没毛病

但是上面说的那种情况 不想这么走 retrofit 的回调是这样的

 RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
        RetrofitUtils.getApiUrl().requestCreateOrders(url, body).enqueue(new Callback<CreateOrderBean>() {
            @Override
            public void onResponse(Call<CreateOrderBean> call, Response<CreateOrderBean> response) {
            }

            @Override
            public void onFailure(Call<CreateOrderBean> call, Throwable t) {

            }
        });

怎么看自定义的message

   RetrofitUtils.getApiUrl().requestCreateOrders(url, body).enqueue(new Callback<CreateOrderBean>() {
            @Override
            public void onResponse(Call<CreateOrderBean> call, Response<CreateOrderBean> response) {
               }

            @Override
            public void onFailure(Call<CreateOrderBean> call, Throwable t) {
                String s = ((MyThrowable) t).getMessageContent();
  
            }
        });

关键代码就一句
((MyThrowable) t).getMessageContent();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Retrofit2进行POST异步请求的示例代码: 1.首先,在build.gradle文件中添加Retrofit2和Gson的依赖: ```gradle dependencies { // Retrofit2 implementation 'com.squareup.retrofit2:retrofit:2.9.0' 'com.squareup.retrofit2:converter-gson:2.9.0' // Gson implementation 'com.google.code.gson:gson:2.8.6' } ``` 2.创建一个接口,用于定义POST请求的URL和参数: ```java public interface PostRequest_Interface { @POST("translate?doctype=json&jsonversion=&type=&keyfrom=&model=&mid=&imei=&vendor=&screen=&ssid=&network=&abtest=") @FormUrlEncoded Call<Translation1> getCall(@Field("i") String targetSentence); } ``` 3.创建一个实体类,用于接收服务器返回的JSON数据: ```java public class Translation1 { private int errorCode; private String query; private List<String> translation; // 省略getter和setter方法 } ``` 4.在Activity中发起POST异步请求: ```java public class MainActivity extends AppCompatActivity { private TextView mTvResult; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTvResult = findViewById(R.id.tv_result); // 创建Retrofit对象 Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://fanyi.youdao.com/") .addConverterFactory(GsonConverterFactory.create()) .build(); // 创建网络请求接口实例 PostRequest_Interface request = retrofit.create(PostRequest_Interface.class); // 发起POST异步请求 Call<Translation1> call = request.getCall("hello"); call.enqueue(new Callback<Translation1>() { @Override public void onResponse(Call<Translation1> call, Response<Translation1> response) { Translation1 translation = response.body(); if (translation != null) { mTvResult.setText(translation.getTranslation().get(0)); } } @Override public void onFailure(Call<Translation1> call, Throwable t) { mTvResult.setText("请求失败:" + t.getMessage()); } }); } } ``` 在上述代码中,我们首先创建了一个Retrofit对象,并指定了请求的基础URL和Gson转换器。然后,我们创建了一个网络请求接口实例,并调用其中的getCall()方法发起POST异步请求。最后,我们在回调方法中处理服务器返回数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值