【Android】HttpURLConnection、OkHttp

WebView 已经在后台帮我们处理好了发送HTTP请求、接收服务器响应、解析返回数据,以及最终的页面展示这几步工作。只不过它封装得实在是太好了,反而使得我们不能那么直观地看出HTTP到底是如何工作的。因此,接下来我们通过手动发送HTTP请求的方式,更加深入地理解这个过程。

在过去,Android上发送HTTP请求一般有两种方式:HttpURLConnection 和HttpClient 。不过由于HttpClient 存在API数量过多、扩展困难等缺点,Android团队越来越不建议我们使用这种方式。终于在Android 6.0 系统中,HttpClient 的功能被完全移除了,标志着此功能被正式弃用。

现在,官方建议使用的HttpURLConnection

HttpURLConnection

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) sendRequestBtn.setOnClickListener {sendRequestWithHttpURLConnection() }}/**在这个方法中先是开启了一个子线程,然后在子线程里使用HttpURLConnection 发出一条HTTP请求。*/private fun sendRequestWithHttpURLConnection() { // 开启线程发起网络请求thread {var connection: HttpURLConnection? = null try {val response = StringBuilder()//首先,需要获取HttpURLConnection 的实例,一般只需创建一个URL对象,并传入目标的网络地 址val url = URL("https://www.baidu.com")//然后,调用一下openConnection()方法即可connection = url.openConnection() as HttpURLConnection //设置:HTTP请求所使用的方法、连接超时、读取超时的毫秒数connection.requestMethod = "GET"connection.connectTimeout = 8000 connection.readTimeout = 8000//之后,再调用getInputStream()方法就可以获取到服务器返回的输入流了val input = connection.inputStream//接着利用BufferedReader 对服务器返回的流进行读取val reader = BufferedReader(InputStreamReader(input)) reader.use {reader.forEachLine {response.append(it) }}//将结果传入showResponse() 方法中。showResponse(response.toString()) } catch (e: Exception) {e.printStackTrace() } finally {connection?.disconnect() }} }private fun showResponse(response: String) { runOnUiThread {// 在这里进行UI操作,将结果显示到界面上responseText.text = response }}
}
<!-- AndroidManifest.xml 声明一下网络权限-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.networktest"><uses-permission android:name="android.permission.INTERNET" />...
</manifest>
<!-- activity_main.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"android:layout_width="match_parent" android:layout_height="match_parent" ><Buttonandroid:id="@+id/sendRequestBtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Send Request" /><ScrollView android:layout_width="match_parent" android:layout_height="match_parent" ><TextViewandroid:id="@+id/responseText" android:layout_width="match_parent" android:layout_height="wrap_content" /></ScrollView></LinearLayout>

提交数据给服务器:

connection.requestMethod = "POST"
val output = DataOutputStream(connection.outputStream) output.writeBytes("username=admin&password=123456")

OkHttp

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

下面我们来看一下OkHttp 的具体用法。
首先,需要创建一个OkHttpClient的实例,如下所示:

val client = OkHttpClient()

接下来如果想要发起一条HTTP请求,就需要创建一个Request对象:

val request = Request.Builder().build()

当然,上述代码只是创建了一个空的Request对象,并没有什么实际作用,我们可以在最终的 build()方法之前连缀很多其他方法来丰富这个Request对象。比如,可以通过url()方法来设置目标的网络地址,如下所示:

val request = Request.Builder().url("https://www.baidu.com").build()

之后调用OkHttpClient 的newCall()方法来创建一个Call对象,并调用它的execute()方法 来发送请求并获取服务器返回的数据,写法如下:

val response = client.newCall(request).execute()

Response对象就是服务器返回的数据了,我们可以使用如下写法来得到返回的具体内容:

val responseData = response.body?.string()

如果是发起一条POST请求,会比GET请求稍微复杂一点,我们需要先构建一个Request Body 对象来存放待提交的参数,如下所示:

val requestBody = FormBody.Builder() .add("username", "admin").add("password", "123456") .build()

然后在Request.Builder 中调用一下post()方法,并将RequestBody对象传入:

val request = Request.Builder() .url("https://www.baidu.com").post(requestBody) .build()

接下来的操作就和GET请求一样了,调用execute()方法来发送请求并获取服务器返回的数据即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/197989.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探讨Unity中的动画融合技术(BlendTree)

动画在游戏和虚拟现实应用中扮演着关键的角色&#xff0c;而动画融合技术则是使角色动作更加流畅和逼真的核心。在Unity引擎中&#xff0c;我们可以使用动画混合树&#xff08;Blend Trees&#xff09;来实现这一目标。本篇技术博客将深入讨论动画融合技术的实现原理、在Unity中…

rust 包模块组织结构

一个包&#xff08;package&#xff09;可以拥有多个二进制单元包及一个可选的库单元包。随着包内代码规模的增长&#xff0c;你还可以将代码拆分到独立的单元包&#xff08;crate&#xff09;中&#xff0c;并将它作为外部依赖进行引用。 RUST提供了一系列的功能来帮助我们管…

做一个类似万师傅家政小程序需要有哪些功能?

现如今人们生活节奏不断加快&#xff0c;自然很少有时间去处理生活中的琐事&#xff0c;恰好家政维修保洁小程序开发则能给线下用户提供方便。 家政保洁小程序应该具备哪些功能&#xff1f; 1、提供家政行业资讯&#xff0c;方便用户在选择家政保洁前了解行业动态。 2、分类搜…

C 中的枚举

简要回顾 最简单的枚举是比宏稍微高级一点的东西。它们可以避免像这样做&#xff1a; #define COLOR_BLACK 0 #define COLOR_WHITE 1 #define COLOR_BLUE 2 #define COLOR_GREEN 3 #define COLOR_RED 4 你可以这样做&#xff1a; enum color {COLOR_BLACK,COLOR_WHITE,COLO…

Android wifi Enable之后扫描流程

流程框架图 通常我们在设备开启wifi之后&#xff0c;等会会自动扫描出周围的热点。 下面看下自动扫描周围热点的流程 代码流程 1. ClientModeManager.ClientModeStateMachine ClientModeStateMachine 由CMD_START 转换到StartedStateStartedState 状态机&#xff0c;在更新…

ubuntu内移除snap

ubuntu 移除snap snap 是 ubuntu 的集中式管理的软件商城&#xff0c;但在使用过程中软件更新没有很及时。ubuntu 20.04 在安装开始就有预装了 snap&#xff0c;所以我想把它移除掉&#xff0c;省出系统空间。 具体参考链接&#xff1a;https://cloud.tencent.com/developer/…

让代码变得优雅简洁的神器:Java8 Stream流式编程

原创/朱季谦 本文主要基于实际项目常用的Stream Api流式处理总结。 因笔者主要从事风控反欺诈相关工作&#xff0c;故而此文使用比较熟悉的三要素之一的【手机号】黑名单作代码案例说明。 我在项目当中&#xff0c;很早就开始使用Java 8的流特性进行开发了&#xff0c;但是一直…

关于区块链

一、区块链 区块链技术是一种去中心化、不可篡改、安全可靠的分布式账本技术&#xff0c;应用场景广泛&#xff0c;有以下几个方面的优势&#xff1a; 金融领域&#xff1a;区块链技术可以用于实现安全的数字货币交易&#xff0c;如比特币等。同时&#xff0c;区块链技术可以用…

流媒体方案之FFmpeg——实现物联网视频监控项目

目录 前言 一、FFmpeg介绍 二、FFmpeg简易理解 三、FFmpeg的重要概念 四、软硬件准备 五、移植、运行FFmpeg 六、运行FFmpeg 前言 最近想做一个安防相关的项目&#xff0c;所以跟着韦东山老师的视频来学习视频监控方案的相关知识&#xff0c;韦东山老师讲的课非常好&…

LaTex入门简明教程

文章目录 写在前面安装Texlive的安装TeXstudio 的安装 LaTex 的使用节指令图指令表指令公式指令参考文献指令引用指令TeXstudio 编译 LaTex 的 \label{} 写法建议最后 写在前面 这篇文章面向没有任何 LaTex 基础的小白&#xff0c;主要讲解了 LaTex 的安装和使用。读完文章之后…

enum 枚举类型

我们可以通过定义枚举IpAddrKind来表达这样的概念&#xff0c;声明该枚举需要列举出所有可能的IP地址种类&#xff0c;也就是所谓的枚举变体&#xff08;variant&#xff09;。 enum IpAddrKind {V4,V6, }枚举的变体全部位于其标识符的命名空间中&#xff0c;并使用两个冒号来…

android https 证书过期

有的时候 我们android https 证书过期 &#xff0c;或者使用明文等方式去访问服务器 可能会碰到类似的 问题 &#xff1a; javax.net.ssl.SSLHandshakeException: Chain validation failed java.security.cert.CertPathValidatorException: Response is unreliable: its validi…

通讯录管理系统(基于C语言)

模块设计 本通讯录管理系统功能模块共包括9个部分&#xff1a;1.输入数据、2.显示数据、 3.插入数据、4.删除数据、5.查看数据、6.修改数据、7.保存数据、 8.返回主菜单、9.退出系统. 一&#xff0e;总体设计 通讯录的每一条信息包括&#xff1a;姓名、性别、住址、联系电话…

西南科技大学模拟电子技术实验七(集成运算放大器的非线性应用)预习报告

一、计算/设计过程 说明:本实验是验证性实验,计算预测验证结果。是设计性实验一定要从系统指标计算出元件参数过程,越详细越好。用公式输入法完成相关公式内容,不得贴手写图片。(注意:从抽象公式直接得出结果,不得分,页数可根据内容调整) 预习计算内容根据运放的非线…

【MODBUS】Modbus主站云端服务器和边缘设备部署区别

Modbus主站作为云端服务器&#xff1a; 云端服务器作为主站&#xff1a; 在这种部署方式中&#xff0c;云端服务器充当Modbus通信的主站&#xff0c;负责向不同的Modbus从站发起请求&#xff0c;并处理响应。云端服务器通常与其他云服务一起运行&#xff0c;可以在云平台上实现…

【Linux下如何生成coredump文件】

一&#xff0c;什么是coredump 我们经常听到大家说到程序core掉了&#xff0c;需要定位解决&#xff0c;这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止&#xff0c;并且在满足一定条件下&#xff08;这里为什么说需要满足一定的条件呢&#…

QT使用SQLite(打开db数据库以及对数据库进行增删改查)

QTSQLite 在QT中使用sqlite数据库&#xff0c;有多种使用方法&#xff0c;在这里我只提供几种简单&#xff0c;代码简短的方法&#xff0c;包括一些特殊字符处理。 用SQlite建立一个简单学生管理数据库 数据库中有两个表一个是class和student。 class表结构 student表结果…

Java零基础-if条件语句

前言 条件语句是编程语言中最基础也是最常用的语句之一&#xff0c;对于初学者来说&#xff0c;掌握好条件语句是学习编程的第一步。本文将以Java开发语言为例&#xff0c;详细介绍Java中的if条件语句及其应用场景。 摘要 本文主要包含以下内容&#xff1a; Java中的if条件…

非标设计之气缸类型

空压机&#xff1a; 空压机又称空气压缩机&#xff0c;简单来说就是将机械能转化为压力能来进行工作的&#xff0c;空压机在电力行业应用比较多&#xff0c;除了在电力行业应用较多外&#xff0c;其实空压机还有一个比较常见的用途就是用来制冷和分离气体&#xff0c;输送气体…

【web安全】RCE漏洞原理

前言 菜某的笔记总结&#xff0c;如有错误请指正。 RCE漏洞介绍 简而言之&#xff0c;就是代码中使用了可以把字符串当做代码执行的函数&#xff0c;但是又没有对用户的输入内容做到充分的过滤&#xff0c;导致可以被远程执行一些命令。 RCE漏洞的分类 RCE漏洞分为代码执行…