Android OkHttp

目录

1.build.gradle

2.基本使用

3.POST请求

4.Builder构建者

1.build.gradle
java 复制代码
implementation("com.squareup.okhttp3:okhttp:4.12.0")
2.基本使用

GET同步请求

java 复制代码
public void getSync(View view) {
        new Thread(){
            @Override
            public void run() {
                Request request = new Request.Builder().url("https://httpbin.org/get?a=1&b=2").build();
                //准备好请求的call对象
                Call call = okHttpClient.newCall(request);
                try {
                    Response response = call.execute();
                    Log.i("TAG", "getSync: "+response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }

GET异步请求

java 复制代码
public void getAsync(View view) {
        Request request = new Request.Builder().url("https://httpbin.org/get?a=1&b=2").build();
        //准备好请求的call对象
        Call call = okHttpClient.newCall(request);
        //异步请求
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {
                Log.i("TAG", "getAsync onFailure",e);
            }

            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                if (response.isSuccessful()){
                    Log.i("TAG", "getAsync onResponse: "+response.body().string());
                }
            }
        });
    }

POST同步请求

java 复制代码
public void postSync(View view) {
        new Thread(){
            @Override
            public void run() {
                FormBody formBody = new FormBody.Builder()
                        .add("a","404").build();
                Request request = new Request.Builder().url("https://httpbin.org/post")
                        .post(formBody).build();   //Request.Builder对象默认get请求
                //准备好请求的call对象
                Call call = okHttpClient.newCall(request);
                try {
                    Response response = call.execute();
                    Log.i("TAG", "postSync: "+response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }

POST异步请求

java 复制代码
public void postAsync(View view) {
        FormBody formBody = new FormBody.Builder()
                .add("a","404").build();
        Request request = new Request.Builder().url("https://httpbin.org/post")
                .post(formBody).build();
        //准备好请求的call对象
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {
                Log.i("TAG", "postAsync onFailure",e);
            }

            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                Log.i("TAG", "postAsync: "+response.body().string());
            }
        });
}
3.POST请求

协议规定 POST 提交的数据必须放在请求体中,但协议并没有规定数据必须使用什么编码方式 。常用的数据编码方式有: https://www.runoob.com/http/http-content-type.html
Content-Type:application/x-www-form-urlencoded
数据被编码为名称/值对,默认类型;
• Content-Type:multipart/form-data
数据被编码为一条消息,一般用于文件上传;
• Content-Type:application/octet-stream
提交二进制数据,如果用于文件上传,只能上传一个文件;
• Content-Type:application/json
提交json数据
提交多个文件

java 复制代码
@Test
public void uploadFileTest() throws IOException {
        OkHttpClient okHttpClient = new OkHttpClient();
        File file1 = new File("H:\\Users\\ASUS\\Desktop\\f1.txt");
        File file2 = new File("H:\\Users\\ASUS\\Desktop\\f2.txt");

        MultipartBody multipartBody = new MultipartBody.Builder()
                .addFormDataPart("f1", file1.getName(), RequestBody.create(file1, MediaType.parse("text/plain")))
                .addFormDataPart("f2", file2.getName(), RequestBody.create(file2, MediaType.parse("text/plain")))
                .build();
        Request request = new Request.Builder().url("https://httpbin.org/post").post(multipartBody).build();
        Call call = okHttpClient.newCall(request);
        Response response = call.execute();
        System.out.println(response.body().string());
    }

提交json数据

java 复制代码
@Test
public void jsonTest() throws IOException {
        OkHttpClient okHttpClient = new OkHttpClient();
        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), "{\"a\":1,\"b\":2}");
        Request request = new Request.Builder().url("https://httpbin.org/post").post(requestBody).build();
        Call call = okHttpClient.newCall(request);
        Response response = call.execute();
        System.out.println(response.body().string());
    }
4.Builder构建者

OkHttpClient okHttpClient = new OkHttpClient.Builder().build();
拦截器
OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor( new XXX ).build();
OkHttpClient okHttpClient = new OkHttpClient.Builder().addNetworkInterceptor( new XXX ).build();

java 复制代码
@Test
    public void interceptorTest() {
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .addInterceptor(new Interceptor() {
            @NonNull
            @Override
            public Response intercept(@NonNull Chain chain) throws IOException {
                //请求前置处理
                Request request = chain.request().newBuilder()
                        .addHeader("os", "android")
                        .addHeader("version", "1.0")
                        .build();
                Response response = chain.proceed(request);
                //请求后置处理
                return response;
            }
        }).addNetworkInterceptor(new Interceptor() {    //一定先执行addInterceptor后执行addNetworkInterceptor  添加顺序不影响执行
            @NonNull
            @Override
            public Response intercept(@NonNull Chain chain) throws IOException {
                System.out.println("version" + chain.request().header("version"));
                return chain.proceed(chain.request());
            }
        }).build();

        Request request = new Request.Builder().url("https://httpbin.org/get?a=1&b=2").build();
        //准备好请求的call对象
        Call call = okHttpClient.newCall(request);
        try {
            Response response = call.execute();
            System.out.println(response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

缓存与 Cookie
OkHttp按照Http协议规则实现了缓存的处理,缓存是比如:当我们发起第一次请求之后,如果后续还需要进行同样的请求,此时如果符合缓存规则,则可以减少与服务器的网络通信,直接从本地文件缓存中读取响应返回给请求者。但是默认情况下,OkHttp的缓存是关闭状态,需要我们开启。

java 复制代码
OkHttpClient okHttpClient = new OkHttpClient.Builder().cache(new Cache(new File("/path/cache"),100))

Cookie是某些网站为了辨别用户身份,进行会话跟踪(比如确定登陆状态)而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息

java 复制代码
Map<String, List<Cookie>> cookie = new HashMap<>();

    @Test
    public void cookieTest() {
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .cookieJar(new CookieJar() {
                    @Override
                    public void saveFromResponse(@NonNull HttpUrl httpUrl, @NonNull List<Cookie> list) {
                        cookie.put(httpUrl.host(), list);            //保存cookie
                    }

                    @NonNull
                    @Override
                    public List<Cookie> loadForRequest(@NonNull HttpUrl httpUrl) {
                        List<Cookie> cookies = cookie.get(httpUrl.host());  
                        return cookies == null ? new ArrayList<>() : cookies;    //加载并返回cookie
                    }
                }).build();
        FormBody formBody = new FormBody.Builder().add("username", "xx").add("password", "xxxxxx").build();
        Request request = new Request.Builder().url("https://www.xxx.com/user/login").post(formBody).build();

        Call call = okHttpClient.newCall(request);
        try {
            Response response = call.execute();
            System.out.println(response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
相关推荐
朱涛的自习室5 小时前
我给 Gemini 4 和 DeepSeek 搞了套「末位淘汰」,AI 干活会更猛吗?(Day 3)
android·前端·后端
应用市场11 小时前
离线小游戏做“每日挑战”:日期当随机种子,整局存成 JSON,再加一个“我不是机器人”
android·kotlin·游戏开发
一铭1119912 小时前
海豹办公 1.9.15 跨端办公软件实践 文档兼容 Access 数据库与移动 WebView 排错
android·数据库·electron·开源软件·access
geats人山人海13 小时前
java 7异常
android·java·开发语言
2601_9620710014 小时前
Kimi K3 vs DeepSeek V4-Pro实测对比:2026年同一入口十道题,耗时与token消耗差在哪
android·java·数据库
右手吉他15 小时前
高通平台IA APN问题分析之二
android·物联网
夜雪一千15 小时前
MySQL 自增 ID 的底层原理与坑点
android·mysql·adb
不浪费一个字节16 小时前
一个纯 Python 实现的 APK 解析与设备操控工具箱
android
itmigrate16 小时前
PHP 导出大 CSV 时内存溢出的一次排查
android·开发语言·php
hai_android16 小时前
LiveEventBusCore 跨 Activity 通讯源码解析
android·kotlin·android jetpack