IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android_okhttp网络请求 -> 正文阅读

[移动开发]Android_okhttp网络请求

年少不知封装好

  • 记一下关于Android里面okhttp网络请求的使用笔记,因为最近做Android的项目,okhttp没做封装而是大段copy,导致整个项目代码繁杂凌乱,需求决定了需要频繁的向服务器发起网络请求,自己写代码又没有写注释的习惯,后面自己回过头看代码的时候是真的头大,人都差点给我整没了,所以作为Java三大特性的封装,现在来看还是很有必要的,再不济也得抽离个方法出来后面直接回调,便于代码理解以及项目修改等等,年少不知封装好,错把copy当成宝。

image.png

okhttp库文件添加依赖

  • 先介绍一下这玩意吧!书上说的是在开源盛行的今天,有许多很出色的网络通信库可以替代Android原生的httpurlconnection网络请求,其中okhttp就是一个很不错的通信库,错不错我不知道,但是okhttp用起来是真的爽,如果有用okhttp来发网络请求的经历,再回去看Android原生的那一个,是真的没可比性,okhttp在封装接口上做的简单易懂,据说在底层的实现上也是自成一派,目前来说是Android开发首选的网络通信库,所以还是很推荐大家去使用的,至于原生的那款通信库了解了解就行了吧,那边主要是可以更加清晰的感知到整个网络请求的发起过程,但代码相对于okhttp来说繁琐不推荐使用!
  • okhttp的项目主页地址,在使用okhttp的时候肯定先要在Android studio里面添加依赖。
    1.第一种呢就是直接导jar包,把Android studio的项目结构先换成project,打开lib目录后直接copy okhttp的jar包进去,然后点击Android studio右上角的小象直接把jar包添加到构建路径(那个小象叫gradle),可以理解和Java里面的maven,反正大致功能一样都是用来做项目管理的。

image.png

2.第二种就是说在没有jar包的情况下,直接在项目中添加okhttp库的依赖,说简单点就是给项目指定个网络路径,让项目自己去下载okhttp的库文件,编辑app/build.gradle文件,在dependencise闭包内添加以下内容:

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    implementation 'com.github.bumptech.glide:glide:4.11.0'
//    这一行为添加的内容 即添加okhttp库的依赖
    compile 'com.squareup.okhttp3:okhttp:3.4.1'
}

image.png
添加完路径之后给他Sync Now一下,这里项目应该是会自己下载两个jar包,一个okhttp库一个okio库,后面那个是前面那个通信的基础(IO流?瞅着很像的嘞),最后让子弹飞一会就好了!

okhttp网络请求的使用

  • 简单的GET请求
//开启一个线程来发起网络请求
new Thread(new Runnable() {
    @Override
    public void run() {
        //先来创建一个okhttp的实例
        OkHttpClient okHttpClient=new OkHttpClient();
        //要发起请求的话 肯定要有一个Request对象
        Request request=new Request.Builder()
                //.url()方法设置要访问的目标地址
                .url("")
                //.build()之前可以连缀很多方法来丰富这个Request对象
                .build();
        //调用OkHttpClient的newCall()方法来创建一个Call对象并调用execute()方法发送请求获取服务器数据
        try {
            Response response=okHttpClient.newCall(request).execute();
            //声明一个变量来接受服务器返回的数据
            String res=response.body().string();
            //打印日志 相当于Java里面的System.out.print(); 但Android的打印推荐使用log
            Log.d("返回数据",res);
            //这里给他抛出一下异常
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}).start();
  • 简单的POST请求 Form提交
//开启一个线程来发起网络请求
new Thread(new Runnable() {
    @Override
    public void run() {
        //先来创建一个okhttp的实例
        OkHttpClient okHttpClient=new OkHttpClient();
        //要发起post请求的话 需要先构建出一个requestBody对象来存放待提交的数据
        RequestBody requestBody=new FormBody.Builder()
                .add("key","key")
                .build();
        //要发起请求的话 肯定要有一个Request对象
        Request request=new Request.Builder()
                //.url()方法设置要访问的目标地址
                .url("")
                //调用post方法
                .post(requestBody)
                //.build()之前可以连缀很多方法来丰富这个Request对象
                .build();
        //调用OkHttpClient的newCall()方法来创建一个Call对象并调用execute()方法发送请求获取服务器数据
        try {
            Response response=okHttpClient.newCall(request).execute();
            //声明一个变量来接受服务器返回的数据
            String res=response.body().string();
            //打印日志 相当于Java里面的System.out.print(); 但Android的打印推荐使用log
            Log.d("返回数据",res);
            //这里给他抛出一下异常
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}).start();
  • 简单的POST请求 JSON提交
//开启一个线程来发起网络请求
new Thread(new Runnable() {
    @Override
    public void run() {
        try {
        //先来创建一个okhttp的实例
        OkHttpClient okHttpClient=new OkHttpClient();
        //创建一个json对象来提交数据
        JSONObject jsonObject=new JSONObject();
        boolean key = false;
        jsonObject.put("key",key);
        String json=jsonObject.toString();
        //要发起post请求的话 需要先构建出一个requestBody对象来存放待提交的数据
        RequestBody requestBody=RequestBody
                .create(MediaType.parse("application/json;charset=utf-8"), json);
        //要发起请求的话 肯定要有一个Request对象
        Request request=new Request.Builder()
                //.url()方法设置要访问的目标地址
                .url("")
                //调用post方法
                .post(requestBody)
                //.build()之前可以连缀很多方法来丰富这个Request对象
                .build();
        //调用OkHttpClient的newCall()方法来创建一个Call对象并调用execute()方法发送请求获取服务器数据
        
            Response response=okHttpClient.newCall(request).execute();
            //声明一个变量来接受服务器返回的数据
            String res=response.body().string();
            //打印日志 相当于Java里面的System.out.print(); 但Android的打印推荐使用log
            Log.d("返回数据",res);
            //这里给他抛出一下异常
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}).start();

可以看到post请求相对于get请求来说就只是多出一个requestBody对象来存放需要提交的参数,不同格式数据提交的post请求也是大同小异,还是比较容易理解的。

okhttp网络请求的简单封装

  • 在实际的编写代码中,不可能做到发一次网络请求就写一次代码,这种做法其实也不是不行,只是太麻烦了,大段大段的重复代码是很差劲的,我们可以将通用的网络请求提取出来给他装到一个公共的类里面去,给他提供一个静态方法,用的时候只需要调用这个方法就好了。
  • get请求静态方法
public class NewOk {
    public static void get(String url,okhttp3.Callback callback){
    //okhttp3.Callback是okhttp自带的一个回调接口
        OkHttpClient okHttpClient=new OkHttpClient();
        Request request=new Request.Builder().url(url).build();
        //.enqueue方法的内部会自己打开子线程 会在子线程中执行请求 最后将返回值回调callback
        okHttpClient.newCall(request).enqueue(callback);
    }
}
  • get静态方法的调用
NewOk.get("http:/www.baidu.com", new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
    //打印异常日志 这不搞一个log 错哪你都不知道
        Log.d("e", String.valueOf(e));
    }
    @Override
    public void onResponse(Call call, Response response) throws IOException {
    //服务器返回的具体内容
        String res=response.body().string();
        Log.d("res",res);
    }
});

特别注意的是:要记得声明网络权限!
在manifists文件内添加:

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

image.png

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-24 00:42:07  更:2022-03-24 00:42:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 19:42:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码