OkHttp同步异步请求(get请求、post请求)

首先要想在安卓中使用okhttp先进行配置。
①在app的build.gradle中添加依赖:

    implementation("com.squareup.okhttp3:okhttp:4.9.0")

②在AndroidManifest.xml中添加联网权限:

    <uses-permission android:name="android.permission.INTERNET"/>

get同步:

        okHttpClient = new OkHttpClient(); //全局变量

        public void getSync(View view) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
                Call call = okHttpClient.newCall(request);
                try {
                    Response response = call.execute();
                    Log.i("TAG", "getSync: " + response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

①首先全局变量创建一个OkHttpClient实例。
②在安卓中,必须要求创建一个线程去执行服务器请求命令:依据所需的url创建一个Request,由该request获取其call。
接下来对call.execute获取回执,并且其中body就是连接服务器后获取的信息。

get异步:

okHttpClient = new OkHttpClient(); //全局变量
public void getAsync(View view) {
        Request request = new Request.Builder().url("https://www.httpbin.org/get?a=1&b=2").build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {

            }

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

异步请求过程前面和同步一样,获取okhttpclient,创建request,获取call。
接着下一步执行call.enqueue()并直接创建其需要的callback实例。
其中两个方法表示获取失败及获取成功、对获取内容的操作。
但这里的获取成功并不一定是真的成功(例如url写错的话,也会执行到onResponse里),需要额外对response的响应码进行正确与否的判断达到判断成功的目的。

注:同步异步的区别:
在同步代码中,通常会发生阻塞,即代码在excute后会进行连接等费时操作,代码也就在这一行等待。并且同步需要我们自己写线程执行。
而在异步代码中,okhttp会在call.enqueue中自动创建线程(不用我们在代码中创建线程),并且在enqueue代码执行完后,并不会阻塞在此处,而是直接继续执行enqueue整个代码块后续的代码。

post同步:

okHttpClient = new OkHttpClient(); //全局变量
public void postSync(View view) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                FormBody formBody = new FormBody.Builder().add("a", "1").add("b", "2").build();
                Request request = new Request.Builder().url("https://www.httpbin.org/post")
                        .post(formBody).build();
                Call call = okHttpClient.newCall(request);
                try {
                    Response response = call.execute();
                    Log.i("TAG", "postSync: " + response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

post同步整体和get同步类似。
在get请求中,我们把需要的参数放在url后面https://www.httpbin.org/get?a=1&b=2即get?a=1&b=2。
而在post中,不写在url中,而是通过创建formbody.add添加进去,并且url也要对应修改为https://www.httpbin.org/post
request获取默认调用的是get请求,若需要调用post请求需要依据formbody进行额外操作。

post异步:

okHttpClient = new OkHttpClient(); //全局变量
public void postAsync(View view) {
        FormBody formBody = new FormBody.Builder().add("a", "1").add("b", "2").build();
        Request request = new Request.Builder().url("https://www.httpbin.org/post")
                .post(formBody).build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {

            }

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

同get操作流程和post自身特性。