Android学习:OkHttp进行网络请求等

简介: OkHttp是一个优秀的网络请求框架,主要介绍介绍OkHttp的Get请求、Post请求、上传下载文件、 上传下载图片等功能。

OkHttp连接后台


OkHttp介绍及基本配置

OkHttp是一个优秀的网络请求框架,主要介绍介绍OkHttp的Get请求、Post请求、上传下载文件、 上传下载图片等功能。


1、进行依赖配置和xml中加入联网权限

在对应的Module的gradle中添加
compile 'com.squareup.okhttp3:okhttp:3.5.0'   
然后同步一下项目即可
同时需要在AndroidMainffest.xml中加入联网的权限
<uses-permission android:name="android.permission.INTERNET" />


进行Get请求

1、拿到OkHttpClient对象

- OkHttpClient client = new OkHttpClient();


2、构造Request对象

Request request = new Request.Builder()
                .get()
                .url("https:www.baidu.com")
                .build();
如果我们需要在get请求时传递参数,我们可以以下面的方式将参数拼接在url之后
https:www.baidu.com?username=admin&password=admin


3、将Request封装为Call

Call call = client.newCall(request);


4、根据需要调用同步或者异步的请求方法

同步调用,返回Response,会抛出IO异常
同步调用会阻塞主线程,一般不适用
Response response = call.execute();
异步调用,并设置回调函数
异步调用的回调函数是在子线程,我们不能在子线程更新UI,
需要借助于runOnUiThread()方法或者Handler来处理
call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        Toast.makeText(OkHttpActivity.this, "get failed", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onResponse(Call call, final Response response) throws IOException {
        final String res = response.body().string();
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                contentTv.setText(res);
            }
        });
    }
});


OkHttp进行Post请求提交键值对

1、拿到OkHttpClient对象

- OkHttpClient client = new OkHttpClient();


2、构建FormBody,传入参数

FormBody formBody = new FormBody.Builder()
                .add("username", "admin")
                .add("password", "admin")
                .build();


3、构建Request,将FormBody作为Post方法参数传入

final Request request = new Request.Builder()
                .url("http://www.jianshu.com/")
                这里的rul可以是别的设置好的string格式的地址
                .post(formBody)
                .build();


4、将Request封装为Call

Call call = client.newCall(request);


5、调用请求 重写回调方法

call.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        Toast.makeText(OkHttpActivity.this, "Post Failed", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onResponse(Call call, Response response) throws IOException {
        final String res = response.body().string();
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                contentTv.setText(res);
            }
        });
    }
});


进行Post传输字符串

//创建一个OkHttpClient对象
        OkHttpClient okHttpClient = new OkHttpClient();
        //创建一个RequestBody,即需要传输的json放入request中进行传输
        RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain;charset=utf-8"),json);
        //创建一个请求对象
        Request request = new Request.Builder()
                .url(url_data)
                .post(requestBody)
                .build();
        Call call=okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                ..
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                ..
            }
        });


进行Post传输文件

方法类同传输json字符串,重要的是设置好RequestBody,txt文件也类同如此,设置好RequestBody就可以了。

File file = new File(Environment.getExternalStorageDirectory(), "1.png");
if (!file.exists()){
    Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show();
}else{
    RequestBody requestBody2 = RequestBody.create(MediaType.parse("application/octet-stream"), file);
    代码中的application/octet-stream表示文件是任意二进制数据流,当然也可以换成更具体的image/png
}


同时注意需要在xml文件中添加权限代码:


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


进行Post传输表单及联动传输图片、字符串等

我们在网页上经常会遇到用户注册的情况,需要你输入用户名,密码,还有上传头像,这其实就是一个表单,那么接下来我们看看如何利用OkHttp来进行表单提交。经过上面的学习,会发现主要的区别就在于构造不同的RequestBody传递给post方法即可。

引入okio.jar包

compile 'com.squareup.okio:okio:1.11.0'

这里我们会用到一个MuiltipartBody,这是RequestBody的一个子类,我们提交表单就是利用这个类来构建一个RequestBody,下面的代码我们会发送一个包含用户民、密码、头像的表单到服务端,同时也需要记得记得在AndroidManifest.xml文件中添加存储卡读写权限。

File file = new File(Environment.getExternalStorageDirectory(), "1.png");
/也可以在这里定义好filepath到时候直接在下面的代码中传入
if (!file.exists()){
    Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show();
    return;
}
RequestBody muiltipartBody = new MultipartBody.Builder()
        /如果提交的是表单一定要设置这句
        .setType(MultipartBody.FORM)
        .addFormDataPart("username", "admin")/第一个双引号是键值对的键,第二个是值
        .addFormDataPart("password", "admin")/第一个双引号是键值对的键,第二个是值
        .addFormDataPart("myfile", "1.png", /第二个参数这里可以换成设置好的路径filepath如下行代码所示/ RequestBody.create(MediaType.parse("application/octet-stream"), file))
        /.addFormDataPart("myfile", filepath,RequestBody.create(MediaType.parse("application/octet-stream"), file))
        .build();
相关文章
|
2月前
|
监控 网络协议 Linux
网络学习
网络学习
139 68
|
2月前
|
Java Maven 开发工具
第一个安卓项目 | 中国象棋demo学习
本文是作者关于其第一个安卓项目——中国象棋demo的学习记录,展示了demo的运行结果、爬坑记录以及参考资料,包括解决Android Studio和maven相关问题的方法。
第一个安卓项目 | 中国象棋demo学习
|
17天前
|
存储 安全 网络安全
浅谈网络安全的认识与学习规划
浅谈网络安全的认识与学习规划
19 6
|
2月前
|
网络协议 网络架构
网络协议介绍与学习
网络协议介绍与学习
41 4
|
2月前
|
网络协议 网络安全 数据安全/隐私保护
网络基础知识学习
如果你打算深入学习网络技术,建议从上述基础知识入手,并逐渐扩展到更高级的主题,如网络编程、网络安全、网络管理等。同时,实践是学习网络技术的关键,可以通过搭建自己的小型网络环境来进行实验和探索。
21 2
|
14天前
|
Web App开发 编解码 视频直播
视频直播技术干货(十二):从入门到放弃,快速学习Android端直播技术
本文详细介绍了Android端直播技术的全貌,涵盖了从实时音视频采集、编码、传输到解码与播放的各个环节。文章还探讨了直播中音视频同步、编解码器选择、传输协议以及直播延迟优化等关键问题。希望本文能为你提供有关Andriod端直播技术的深入理解和实践指导。
19 0
|
2月前
|
Android开发
Android学习 —— 测试init.rc中的条件触发的处理顺序
Android学习 —— 测试init.rc中的条件触发的处理顺序
|
2月前
|
网络协议 安全 网络安全
网络基础知识学习
【9月更文挑战第1天】
57 0
|
3月前
|
前端开发 算法 网络协议
如何学习计算机基础知识,打好前端和网络安全的基础
如何学习计算机基础知识,打好前端和网络安全的基础
46 4
|
3月前
|
搜索推荐 Android开发
学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?
本文分享了不同价位电脑配置对于编译AOSP安卓系统源代码的影响,提供了从6000元到更高价位的电脑配置实例,并比较了它们的编译时间,以供学习AOSP源代码时电脑配置选择的参考。
185 0
学习AOSP安卓系统源代码,需要什么样的电脑?不同配置的电脑,其编译时间有多大差距?