Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android学习:OkHttp进行网络请求等

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

作者头像
程序员洲洲
发布于 2024-06-06 13:47:55
发布于 2024-06-06 13:47:55
51600
代码可运行
举报
文章被收录于专栏:项目文章项目文章
运行总次数:0
代码可运行

OkHttp连接后台

OkHttp介绍及基本配置

  • OkHttp是一个优秀的网络请求框架,主要介绍介绍OkHttp的Get请求、Post请求、上传下载文件、 上传下载图片等功能。
  • 1、进行依赖配置和xml中加入联网权限
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
在对应的Module的gradle中添加
compile 'com.squareup.okhttp3:okhttp:3.5.0'   
然后同步一下项目即可

同时需要在AndroidMainffest.xml中加入联网的权限
<uses-permission android:name="android.permission.INTERNET" />

进行Get请求

  • 1、拿到OkHttpClient对象
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 - OkHttpClient client = new OkHttpClient();
  • 2、构造Request对象
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Call call = client.newCall(request);
  • 4、根据需要调用同步或者异步的请求方法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
同步调用,返回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对象
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 - OkHttpClient client = new OkHttpClient();
  • 2、构建FormBody,传入参数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FormBody formBody = new FormBody.Builder()
                .add("username", "admin")
                .add("password", "admin")
                .build();
  • 3、构建Request,将FormBody作为Post方法参数传入
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
final Request request = new Request.Builder()
                .url("http://www.jianshu.com/")
                这里的rul可以是别的设置好的string格式的地址
                .post(formBody)
                .build();
  • 4、将Request封装为Call
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Call call = client.newCall(request);
  • 5、调用请求 重写回调方法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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传输字符串

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 		 //创建一个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就可以了。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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文件中添加权限代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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文件中添加存储卡读写权限。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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();
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Okhttp学习及封装
四个按钮需要写入布局 get请求,post请求,下载文件,上传文件 别忘了加入SD卡权限,网络权限
全栈程序员站长
2022/11/19
6110
网络请求框架OkHttp3全解系列(一):OkHttp的基本使用
现在Android中的网络请求框架,基本都是okhttp和Retrofit一统天下,而Retrofit又是以okhttp为基础,所以系统学习okhttp的使用和原理就很有必要了。
胡飞洋
2020/07/23
31.4K0
网络请求框架OkHttp3全解系列(一):OkHttp的基本使用
OkHttp3 基本用法
这篇文章说下OkHttp的基本用法,是最新的3哦,如果你在网上搜索OkHttp怎么使用发现有些类没有了可能是因为人家说的是2。
一个会写诗的程序员
2018/08/17
8150
网络请求-Android篇(Okhttp和Retrofit)
  OkHttp是一个流行的开源Java和Android应用程序的HTTP客户端。它由Square Inc.开发,提供了一种简单高效的方式来进行应用程序中的HTTP请求。要在Java或Android项目中使用OkHttp,您需要将OkHttp依赖项添加到您的build.gradle文件中。然后,您可以创建一个OkHttpClient实例,并使用它来进行HTTP请求。OkHttp提供了各种类和方法,用于构建和执行请求、处理响应。使用OkHttp的时候,需要引入:implementation 'com.squareup.okhttp3:okhttp:4.10.0',别忘了添加网络权限!
故乡的樱花开了
2023/10/22
1.8K0
OkHttp使用详解
_当然在开始之前,我们还要先在项目中添加OkHttp的依赖库,至于怎么在AndroidStudio中给项目添加OkHTTP依赖,这里将不再赘述。另外,OkHttp中使用了建造者模式,如果对建造者模式不了解,可以看看这篇博客设计模式之建造者模式_**
做个快乐的码农
2021/12/03
12K0
OkHttp使用详解
Android网络框架OKhttp3学习笔记
OKhttp3是一个非常强大的Android网络框架,它是由Square公司开发并开源的,很大Android开发者都会使用到,所以我也要来学学。
夜雨飘零
2020/05/06
7980
OkHttp
之前一直用Hutool,早就忘记OkHttp这个牛逼的工具了,因为担心公司整体业务使用OkHttp,于是将原Hutool代码修改为OkHttp。
收心
2022/09/29
5730
OkHttp学习笔记
OkHttp是一个HTTP客户端,它不只是简单的发送请求和接收响应,还包含了失败重试、响应缓存等特性功能,并且能支持同步和异步请求。
dongfanger
2023/03/09
8730
OkHttp搞定Http请求
当网络出现问题时,OkHttp会自动恢复一般的连接问题;若服务有多个IP地址,当第一个IP请求失败时,OkHttp会交替尝试你配置的其他IP。
鱼找水需要时间
2023/02/16
2.8K0
深入解析OkHttp3
OkHttp是一个精巧的网络请求库,有如下特性: 1)支持http2,对一台机器的所有请求共享同一个socket 2)内置连接池,支持连接复用,减少延迟 3)支持透明的gzip压缩响应体 4)通过缓存避免重复的请求 5)请求失败时自动重试主机的其他ip,自动重定向 6)好用的API
老马的编程之旅
2022/06/22
3.3K0
深入解析OkHttp3
Android网络编程(六)OkHttp3用法全解析
上一篇介绍了OkHttp2.x的用法,这一篇文章我们来对照OkHttp2.x版本来看看,OkHttp3使用起来有那些变化。当然,看这篇文章前建议看一下前一篇文章Android网络编程(五)OkHttp2.x用法全解析。
提莫队长
2019/05/26
1.9K0
[番外]理一理Android多文件上传那点事
多文件上传是客户端与服务端两个的事,客户端负责发送,服务端负责接收 我们都知道客户端与服务器只是通过http协议进行交流,那么http协议应该会对上传文件有所规范 你可以根据这些规范来自己拼凑请求
张风捷特烈
2018/12/18
1.6K0
OkHttp3的基本用法
这篇文章说下OkHttp的基本用法,是最新的3哦,如果你曾经在网上搜索OkHttp怎么使用发现有些类没有了可能是因为人家说的是2。
Albert陈凯
2018/10/08
4.9K0
OkHttp 使用示例
可以用来下载文件,打印header,打印body。string()方法对于小文档的响应来说是个既方便又高效的方法。但是如果一个文档太大(大于1M),就不要使用string()方法了,因为这个方法会把整个文档加载到内存中,在这种情况下可以把body当作流来处理。
代码拾遗
2018/07/24
2.9K0
5--安卓网络编程之OKHttp3的使用
零、前言 安卓的网络编程,服务端的知识是必不可少的,否则不知道该请求什么url,或不明白服务端是什么样的,总像是拼图少了一半 还好本人会些SpringBoot压箱底,这里提供了可访问的URL供大家测试,以及后端的具体实现的链接,感兴趣的可以看一下 本文安卓端基本上是根据慕课网上hyman的Android网络框架-OkHttp使用 敲的,懒得看文章的可以去看看视频 不过版本OKHttp3.X和视频中2.X稍有不同,还有本文服务端使用SpringBoot与视频不同 本文测试的url为已在服务器上,可
张风捷特烈
2018/11/07
1.4K0
borrow用法及短语(that is ok用法)
大家好,又见面了,我是你们的朋友全栈君。 public class MainActivity extends AppCompatActivity { String path="https://www.zhaoapi.cn/ad/getAd"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCon
全栈程序员站长
2022/07/25
3.5K0
android之OkHttpClient通信「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/126999.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/20
6000
android学习笔记----开源AsyncHttpClient、OkHttp实现get、post提交数据
来看看上一篇记录get、post方式提交以及抓包和乱码问题,里面是开启子线程联网再提交,post方式就更复杂了。现在用开源项目就简单得多。tomcat服务器端代码参见上一篇,这里不赘述了,只看android端。
砖业洋__
2023/05/06
4890
android学习笔记----开源AsyncHttpClient、OkHttp实现get、post提交数据
使用OkHttp发送POST请求的快速入门指南
在本篇简短的技术文章中,我们将特别介绍 OkHttp 3.x 版本中发送Post请求的不同方式。
明明如月学长
2021/08/31
11.6K0
Android MVP+RxJava+Retrofit (2) RxJava+Retrofit
说道RxJava+Retrofit 的组合 大家基本不陌生,先介绍一下Retrofit Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装,网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装。说白了真正工作的还是OkHttp 。
全栈程序员站长
2022/06/29
8860
Android MVP+RxJava+Retrofit (2) RxJava+Retrofit
相关推荐
Okhttp学习及封装
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档