android:retrofit库使用拦截器interceptor

一,安装第三方库

库地址:

https://mvnrepository.com/artifact/com.squareup.okhttp3/logging-interceptor

编辑 build.gradle,增加

    // https://mvnrepository.com/artifact/com.squareup.okhttp3/logging-interceptor
    implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'

然后点击 Sync Now

二,代码

interceptor类

package com.example.okdemo1.interceptor;


import android.util.Log;

import java.io.IOException;
import java.util.Locale;

import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.Request;
import okhttp3.Response;

public class LogInterceptor implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();

        String typeStr = "";
        long contentLen = 0;
        String reqBody = "";

        //request.body().

        if (request.body() != null) {
            MediaType contentType = request.body().contentType();
            typeStr = contentType.toString();
            contentLen = request.body().contentLength();
            reqBody = request.body().toString();
        }


        //.contentType().toString()

        Log.i("TEST", "MyIntercepter.intercept.request.toString -> " + request.toString());
        Log.i("TEST", String.format(Locale.getDefault(),
                "MyIntercepter.intercept.requestbody -> {contentType : %1$s, contentLength : %2$d, toString : %3$s}",
                //request.body().contentType().toString(),
                typeStr,
                contentLen,
                reqBody));

        Response response = chain.proceed(request);
        String content = response.body().string();
        okhttp3.MediaType mediaType = response.body().contentType();
        Log.i("TEST", "MyIntercepter.intercept.response.message -> " + response.message());
        Log.i("TEST", "MyIntercepter.intercept.response.toString -> " + response.toString());
        Log.i("TEST", "MyIntercepter.intercept.response.body -> " + content);
        return response.newBuilder().body(okhttp3.ResponseBody.create(content,mediaType)).build();
    }
}

在activity中调用

package com.example.okdemo1.activity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;

import com.example.okdemo1.MainActivity;
import com.example.okdemo1.R;
import com.example.okdemo1.interceptor.LogInterceptor;
import com.example.okdemo1.interfaces.ApiServiceInterface;
import com.example.okdemo1.model.BaseEntity;
import com.example.okdemo1.model.UserListEntity;
import com.example.okdemo1.model.UserListItemEntity;

import java.util.List;

import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class ApiActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_api);

        //给按钮增加点击事件
        Button button2 = findViewById(R.id.apiBtn);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 //访问接口
                request();
            }
        });
    }

    //retrofit2 请求方法
    public void request() {

        LogInterceptor loggingInterceptor = new LogInterceptor();

        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(loggingInterceptor) // 这个会全部打印出来
                .build();

        //创建Retrofit对象
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://www.testit.net") // 设置 网络请求 Url
                .client(client)
                .addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析(记得加入依赖)
                .build();

        //创建 网络请求接口 的实例
        ApiServiceInterface request = retrofit.create(ApiServiceInterface.class);

        //对 发送请求 进行封装
        String cate="HOUSE";
        int channelId = 123;
        Call<BaseEntity<UserListEntity>> call = request.getUserList(cate,channelId);

        //发送网络请求(异步)
        call.enqueue(new Callback<BaseEntity<UserListEntity>>() {
            //请求成功时回调
            @Override
            public void onResponse(Call<BaseEntity<UserListEntity>> call, Response<BaseEntity<UserListEntity>> response) {
                //处理返回的数据结果
                List<UserListItemEntity> list = response.body().getData().getList();
                //遍历list数据
                for (int i = 0; i < list.size(); i++) {
                    UserListItemEntity one = list.get(i);
                    //对元素进行操作
                    String image = one.getImage().replace("abc", "test");;
                    System.out.println("one:"+one.getId()+"-"+one.getName()+"-"+image);
                }
            }

            //请求失败时回调
            @Override
            public void onFailure(Call<BaseEntity<UserListEntity>> call, Throwable throwable) {
                System.out.println("连接失败");
            }
        });
    }
}

 

三,测试效果

posted @ 2025-06-14 15:22  刘宏缔的架构森林  阅读(115)  评论(0)    收藏  举报