Android:OkHttp同步请求和异步请求

一、前言

网络请求之前工作中用到的是post请求,然后了解之后发现请求的种类还有很多种。下面着重讲到是get和post的同步请求和异步请求。

二、具体内容

1.Okhttp的特点:

  • 支持Http/2并允许对同一主机的所有请求共享一套接字;
  • 如果非HTTP/2,则通过连接池,减少了请求延迟;
  • 默认请求GZip压缩数据;
  • 响应缓存,避免了重复请求网络;

2.get的同步请求

需要用到的测试网址:

复制代码
https://httpbin.org

测试代码如下:

java 复制代码
public class OkhttpTestActivity extends AppCompatActivity {

    private OkHttpClient okHttpClient;//新建okHttp请求器

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_okhttp_test);
        okHttpClient = new OkHttpClient();
    }
    public void getSync(View view){//get同步请求
        /**
         * 括号里是请求的域名以及需要上传的参数
         * 如果需要上传参数只需要在请求域名后面加一个?a=1&b=2
         */

        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();
                    System.out.println(response.body().string());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                super.run();
            }

        }.start();


    }
}

运行结果截图

使用get同步请求时遇到的问题如下

之前写代码是这样的

java 复制代码
 public void getSync(View view){//get同步请求
        /**
         * 括号里是请求的域名以及需要上传的参数
         * 如果需要上传参数只需要在请求域名后面加一个?a=1&b=2
         */

        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();
                    System.out.println(response.body().toString());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                super.run();
            }

        }.start();

在获取请求体的时候用response.body().toString();报错如下

修改方案:

java 复制代码
   public void getSync(View view){//get同步请求
        /**
         * 括号里是请求的域名以及需要上传的参数
         * 如果需要上传参数只需要在请求域名后面加一个?a=1&b=2
         */

        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();
                    System.out.println(response.body().string());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                super.run();
            }

        }.start();


    }

把请求体改成response.body().string()就好了

**总结:**同步请求要等call.execute执行完成之后再执行接下去的代码

3.get的异步请求

知识点补充:

1.异步请求和同步请求的区别时异步请求调用的是enqueue方法。然后传递一个回调对象给 enqueue方法,需要用到callback方法中的两个接口回调。callback中有两个接口需要实现,一 个是请求失败的回调接口另一个是请求结束的回调接口

2.需要注意的的是请求码是200成功404失败,无论是200~299还是404都会调用结束的接口所以 当调用onResponse接口时也不意味者接口调用成功了

3.当调用response只意味着我们跟服务器之间的通信是成功的,处理数据不一定成功。

4.200~300之间代表成功300~400代表重定向400~~500代表服务器错误

java 复制代码
public class OkhttpTestActivity extends AppCompatActivity {

    private OkHttpClient okHttpClient;//新建okHttp请求器

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_okhttp_test);
        okHttpClient = new OkHttpClient();
    }


    public void getAync(View view) {//get异步请求
        Request request = new Request.Builder().url("https://httpbin.org/get?a=1&b=2").build();
        //一个准备好请求的call对象
        Call call = okHttpClient.newCall(request);
        //异步请求和同步请求的区别时异步请求调用的是enqueue方法然后传递一个回调对象给enqueue方法,callback中有两个接口需要实现,一个是请求失败的回调接口另一个是请求结束的回调接口
        //需要注意的的是请求码是200成功404失败,无论是200~299还是404都会调用结束的接口所以当调用onResponse接口时也不意味者接口调用成功了
        //当response出现200是只意味着我们跟服务器之间的通信是成功的,处理数据不一定成功
        //200~300之间代表成功300~400代表重定向400~~500代表服务器错误
        call.enqueue(new Callback() {
            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                if (response.isSuccessful()) {
                    System.out.println(response.body().string());
                }
            }

            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {

            }

        });

    }
}

运行结果

**总结:**异步请求不会等服务器请求完成之后再去执行后面的代码enqueue内部就会帮我们创建子线程我们不需要自己再创建子线程。

4.post同步请求

**注意点:**OkHttp默认创建出来的request是get请求

get请求和post请求的区别:get请求需要加在url的后面,然而post请求需要把请求参数放在请求体里面

测试代码:

java 复制代码
public class OkhttpTestActivity extends AppCompatActivity {

    private OkHttpClient okHttpClient;//新建okHttp请求器

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_okhttp_test);
        okHttpClient = new OkHttpClient();
    }

    public void postSync(View view) {//post同步请求
        FormBody formBody = new FormBody.Builder().add("a", "1").add("b", "2").build();
        Request request = new Request.Builder().url("https://httpbin.org/post").post(formBody).build();
        new Thread(){
            @Override
            public void run() {
                //一个准备好请求的call对象
                Call call = okHttpClient.newCall(request);
                try {
                    Response response = call.execute();
                    System.out.println(response.body().string());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                super.run();
            }
        }.start();
    }
}

测试结果:

5.post异步请求

测试代码

java 复制代码
public class OkhttpTestActivity extends AppCompatActivity {

    private OkHttpClient okHttpClient;//新建okHttp请求器

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_okhttp_test);
        okHttpClient = new OkHttpClient();
    }

    public void postAync(View view) {//post异步请求
        FormBody formBody = new FormBody.Builder().add("a", "1").add("b", "2").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) {

            }

            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                System.out.println(response.body().string());

            }
        });
    }

}

测试结果

6.测试请求的页面布局

我在一个页面上放置了四个按钮代码如下:

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".ui.study.OkhttpTestActivity">
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="getSync"
        android:text="GET同步请求"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="getAync"
        android:text="GET异步请求"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="postSync"
        android:text="POST同步请求"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="postAync"
        android:text="POST异步请求"/>

</LinearLayout>

**总结:**post请求和get请求参数位置不同post要放到FormBody里面其他的相差不大,最后希望可以帮到你。

相关推荐
一壶浊酒..1 天前
ajax局部更新
前端·ajax·okhttp
洛克大航海4 天前
Ajax基本使用
java·javascript·ajax·okhttp
whltaoin11 天前
Java 网络请求 Jar 包选型指南:从基础到实战
java·http·okhttp·网络请求·retrofit
华农第一蒟蒻12 天前
谈谈跨域问题
java·后端·nginx·安全·okhttp·c5全栈
一直向钱13 天前
android 基于okhttp的socket封装
android·okhttp
linuxxx11013 天前
ajax回调钩子的使用简介
okhttp
一直向钱14 天前
android 基于okhttp 封装一个websocket管理模块,方便开发和使用
android·websocket·okhttp
linuxxx11015 天前
ajax() 回调函数参数详解
前端·ajax·okhttp
linuxxx11017 天前
ajax与jQuery是什么关系?
ajax·okhttp·jquery
耀耀_很无聊19 天前
12_OkHttp初体验
okhttp