android实现okHttp的get和post请求的简单封装与使用

下面就为您详细讲解一下“android实现okHttp的get和post请求的简单封装与使用”的攻略。

准备工作

在进行okHttp的get和post请求的封装前,需要先在项目的 build.gradle 文件里添加 okHttp 的依赖:

dependencies {
    implementation 'com.squareup.okhttp3:okhttp:4.5.0'
}

封装过程

封装Get请求

在进行Get请求的封装前,我们需要先定义一个公共的接口类:

public interface GetDataService {
    @GET("api/data/{type}/{page}/{count}")
    Call<ResponseBody> getData(@Path("type") String type, @Path("page") int page, @Path("count") int count);
}

这个接口类里使用了 @GET 注解来指明这是个 Get 请求,根据路径参数 typepagecount 来获取指定的数据。接下来就是封装 Get 请求的代码:

public class HttpUtil {
    // 封装 Get 请求
    public static void sendGetRequest(String type, int page, int count, Callback callback) {
        // 创建 OkHttpClient 实例
        OkHttpClient client = new OkHttpClient();
        // 计算请求的 Url
        String url = "http://gank.io/" + "api/data/" + type + "/" + page + "/" + count;
        // 创建 Request 实例
        Request request = new Request.Builder().url(url).build();
        // 发送异步 GET 请求
        client.newCall(request).enqueue(callback);
    }
}

这里我们将 Get 请求封装在了 HttpUtilsendGetRequest 方法中,并使用 OkHttp 的 OkHttpClient() 方法来创建实例,计算出请求的 Url,创建 Request 实例,并使用 client.newCall(request).enqueue(callback) 异步发送 GET 请求。需要注意的是,这里我们使用了一个 Callback 类型的参数来处理异步请求的回调结果。

封装 Post 请求

封装 Post 请求的方法其实和 Get 请求并没有太大区别,同样需要先定义一个公共的接口类:

public interface PostDataService {
    @FormUrlEncoded
    @POST("api/post/data")
    Call<ResponseBody> postData(@Field("name") String name, @Field("age") int age);
}

这个接口类里使用了 @POST 注解来指明这是个 Post 请求,并且使用 @FormUrlEncoded@Field 注解来传递两个请求参数 nameage。接下来就是封装 Post 请求的代码:

public class HttpUtil {
    // 封装 Post 请求
    public static void sendPostRequest(String name, int age, Callback callback) {
        // 创建 OkHttpClient 实例
        OkHttpClient client = new OkHttpClient();
        // 创建 FormBody 实例
        FormBody.Builder builder = new FormBody.Builder();
        builder.add("name", name);
        builder.add("age", String.valueOf(age));
        FormBody formBody = builder.build();
        // 创建 Request 实例
        Request request = new Request.Builder().url("http://www.example.com/api/post/data").post(formBody).build();
        // 发送异步 POST 请求
        client.newCall(request).enqueue(callback);
    }
}

这里我们同样将 Post 请求封装在了 HttpUtilsendPostRequest 方法中,并创建一个 FormBody 实例,使用 builder.add("name", name)builder.add("age", String.valueOf(age)) 添加了两个请求参数,然后创建 Request 实例,并使用 client.newCall(request).enqueue(callback) 异步发送 POST 请求。

使用示例

下面是一个 Get 请求的示例,我们在 onCreate() 方法中调用 HttpUtil 类中的 sendGetRequest 方法来发送异步 Get 请求并获取数据:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        HttpUtil.sendGetRequest("Android", 1, 10, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String responseData = response.body().string();
                Log.d("MainActivity", responseData);
            }
        });
    }
}

这里我们传递了三个参数:类型为 "Android",第一页,每页有10条数据。回调函数中的 response.body().string() 方法获取到了请求返回的数据,并打印到了控制台中。

下面是一个 Post 请求的示例,我们同样可以在 onCreate() 方法中调用 HttpUtil 类中的 sendPostRequest 方法来发送异步 Post 请求:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        HttpUtil.sendPostRequest("Tom", 20, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String responseData = response.body().string();
                Log.d("MainActivity", responseData);
            }
        });
    }
}

这里我们传递了两个参数:name 为 "Tom",age 为 20。回调函数中的 response.body().string() 方法同样可以获取到请求返回的数据,并打印到了控制台中。

至此,我们就完成了 okHttp 的 get 和 post 请求的封装以及使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:android实现okHttp的get和post请求的简单封装与使用 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • 应用宝app首页栏目怎么自定义设置?

    应用宝是一款著名的应用商店,用户可以通过它下载并安装各种应用软件。在应用宝的首页中,顶部会展示一些常用的栏目,例如推荐、排行榜、分类等。对于APP开发者来说,自定义设置应用宝首页栏目是非常重要的,可以帮助应用更好地展现出来,提高下载量和曝光率。 下面是应用宝app首页栏目自定义设置的详细攻略: 1.注册成为应用宝开发者 开发者需要先在应用宝开发者中心注册账号…

    other 2023年6月25日
    00
  • c语言实现一些简单图形的打印

    c语言实现一些简单图形的打印 在c语言中,我们可以通过屏幕打印的方式实现简单的图形输出。以下将介绍如何使用c语言实现一些简单的图形打印。 打印一条横线 要在屏幕上打印一条横线,我们可以使用for循环实现如下的代码: #include <stdio.h> int main() { int i; for (i = 0; i < 10; i++)…

    其他 2023年3月28日
    00
  • C++的sstream标准库详细介绍

    下面是关于C++的sstream标准库详细介绍的攻略。 1. 什么是sstream标准库? C++的sstream标准库是用于将数据类型转换为字符串并将字符串转换为数据类型的库。通过sstream可以方便地实现不同数据类型之间的转换,例如将整数类型的数据转换为字符串类型的数据,或者反向转换。sstream库提供了stringstream和istringstr…

    other 2023年6月27日
    00
  • 使用navicatkeygen激活(破解)navicatpremium12

    使用navicatkeygen激活(破解)navicatpremium12 Navicat是一个非常优秀的数据库管理工具,提供了易于使用的界面和强大的功能来管理多个数据库。然而,Navicat Premium是一个高级版,需要购买授权才能使用。有些人却想通过破解(例如使用navicatkeygen)来获取该软件的授权。本文章就来介绍如何使用navicatke…

    其他 2023年3月29日
    00
  • Java的深拷贝和浅拷贝深入了解

    Java的深拷贝和浅拷贝深入了解 什么是深拷贝和浅拷贝 在Java中,对象的拷贝分为深拷贝和浅拷贝两种方式。 浅拷贝:浅拷贝是指创建一个新对象,然后将原对象的非静态字段值复制到新对象中。如果字段是基本类型,则复制其值;如果字段是引用类型,则复制其引用,即新对象和原对象引用同一个对象。因此,对于引用类型字段的修改会影响到原对象和新对象。 深拷贝:深拷贝是指创建…

    other 2023年10月15日
    00
  • 教你认清六种网络特殊用途IP地址

    教你认清六种网络特殊用途IP地址 在网络中,有一些特殊用途的IP地址被保留用于特定的目的。这些IP地址不用于一般的主机通信,而是用于特殊的网络功能。下面是六种常见的网络特殊用途IP地址及其用途的详细说明: 1. 0.0.0.0 这个IP地址被称为“未指定地址”或“通配地址”。它用于表示当前主机的任何IP地址,或者用于表示目标地址未知的情况。在网络编程中,0.…

    other 2023年7月29日
    00
  • PHP面相对象中的重载与重写

    PHP面向对象中的重载与重写 在PHP面向对象编程中,重载(overloading)和重写(overriding)是两个常用的概念。它们可以帮助开发者更加灵活地处理对象的属性和方法。接下来将进行详细解释。 重载 重载是指在类中定义特定方法来处理特定的操作符或者方法。这些方法可以被调用来为对象设置属性或者执行方法的访问。 __get()和__set()方法 _…

    other 2023年6月26日
    00
  • js正则中文

    JS正则中文 在 JavaScript 中,正则式是用来匹配文本的模式。一般用来检查字符串是否符合一定的格式,或者从字符串中提取某些特定的部分。 在正则表达式中使用中文时,需要注意一些问题。 1. 编码问题 JavaScript 中的字符串默认采用 UTF-16 编码,而正则表达式则会先将字符串转为 UTF-8 编码,然后才进行匹配操作。对于只含有 ASCI…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部