android开发,使用kotlin学习HTTP访问网络

简介: android开发,使用kotlin学习HTTP访问网络



HTTP协议的简介

在日常生活中,我们使用手机APP时,APP展示的数据基本上都是通过网络接口从服务器中获取的。

HTTP是一种请求/响应模式的协议,当客户端与在服务器建立连接后,向服务器发送请求,称为HTTP请求,服务器收到请求后会做出响应,称为HTTP响应

HTTP协议的请求

HTTP有两种常用的请求方式,它们分别是GET,POST。

  • GET:请求指定的页面消息,并返回实体主体。
  • POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据被包含在请求体中。POST请求可能会导致新的资源的·建立或已有资源的修改。

GET和POST的区别

  1. GET提交的数据会放在URL之后,以“?”分隔URL和传输数据,参数以“&”相连,如EditPosts.aspx?name=text1&id=123456。POST是把提交的数据放在HTTP包的主体中。
  2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST提交的数据没有限制。
  3. GET提交的数据会带来安全问题,比如一个登录页面,通过GET请求方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台服务器,就可以从历史记录获取该用户的用户名和密码。

使用httpURLConnection访问网络

1.url:包含请求地址的类

  • URL(path):包含请求路径的构造方法
  • openConnection():得到连接对象

2.HttpURLConnection:代表与服务器连接的类

  • requestMethod:设置请求方式,有GET和POST
  • requestTimeout:设置连接超时时间,单位为ms
  • readTimeout:设置读取服务器放回数据的时间
  • 断开连接():断开连接

3.HttpURLConnection的使用

在分线程,发送请求,得到响应数据

1.得到路径,创建URL对象。

val url=URL("https://www.baidu.com")

2.打开连接,得到HttpURLConnection对象

connection=url.openConnection() as HttpURLConnection

3.设置请求

GET:

connection.requestMethod="GET"

POST :

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

4.设置秒连接超时,读取数据超时

connection.connectTimeout=8000
connection.readTimeout=8000

5.得到InputStream,并读取成String

val input=connection.inputStream
val reader=BufferedReader(InputStreamReader(input))
reader.use {
        reader.forEachLine {
        response.append(it)
        }
}

6.断开连接

connection?.disconnect()

7.声明网络权限

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

4.练习

(要在有网络的模型机)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".HttpActivity">
    <Button
        android:id="@+id/sendRequestBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送请求"
        />
    <ProgressBar
        android:id="@+id/progress1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/responseText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </ScrollView>
</LinearLayout>
class HttpActivity : AppCompatActivity() {
    lateinit var send:Button
    lateinit var responseText:TextView
    lateinit var progressBar1:ProgressBar
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_http)
        send=findViewById(R.id.sendRequestBtn)
        responseText=findViewById(R.id.responseText)
        progressBar1=findViewById(R.id.progress1)
        progressBar1.visibility=View.INVISIBLE
        send.setOnClickListener {
            progressBar1.visibility=View.VISIBLE
            sendRequestWithHttpURLConnection()
        }
    }
    private fun sendRequestWithHttpURLConnection() {
        thread{
            var connection:HttpURLConnection?=null
            try {
                val response=StringBuilder()
                val url=URL("https://www.baidu.com")
                connection=url.openConnection() as HttpURLConnection
                connection.requestMethod="GET"
                connection.connectTimeout=8000
                connection.readTimeout=8000
                val input=connection.inputStream
                val reader=BufferedReader(InputStreamReader(input))
                reader.use {
                        reader.forEachLine {
                            response.append(it)
                        }
                    }
                showResponse(response.toString())
            }catch (e:Exception){
                e.printStackTrace()
            }finally {
                progressBar1.visibility=View.INVISIBLE
                connection?.disconnect()
            }
        }
    }
    private fun showResponse(response: String) {
        runOnUiThread {
            responseText.text=response
        }
    }
}
<uses-permission android:name="android.permission.INTERNET" />

使用OkHttp访问网络

OkHttp不仅在接口封装上做得简单易用,就连在底层实现上也是自成一派,比起HttpURLConnection有过之而无不及。

OkHttp的使用步骤:

1.添加OkHttp库的依赖

implementation 'com.squareup.okhttp3:okhttp:4.1.0'

2.创建OkHttpClient的实例

val client=OkHttpClient()

3.创建Request对象

GET:

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

POST:

val requestBody=FormBody.Builder()
                    .add("username","admin")
                    .add("password","123456")
                    .build()
val request=Request.Builder()
                    .url("https://www.baidu.com")
                    .post(requestBody)
                    .build()

4.创建Call对象,发送请求

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

5.得到服务器返回的数据

val responseData=response.body?.string()

简单的实例:

private fun sendRequestWithokHttp() {
        thread {
            try {
                val client=OkHttpClient()
                val request=Request.Builder()
                    .url("https://www.baidu.com")
                    .build()
                val response=client.newCall(request).execute()
                val responseData=response.body?.string()
                if(responseData!=null) {
                    showResponse(responseData)
                }
            }
            catch (e:Exception){
                e.printStackTrace()
            }
        }
    }
目录
相关文章
|
7月前
|
网络协议 Linux 虚拟化
配置VM网络:如何设定静态IP以访问主机IP和互联网
以上就是设定虚拟机网络和静态IP地址的基本步骤。需要注意的是,这些步骤可能会因为虚拟机软件、操作系统以及网络环境的不同而有所差异。在进行设定时,应根据具体情况进行调整。
518 10
|
8月前
|
Shell 开发工具 git
使用代理访问网络各项命令总结
工作中常需设置代理,容易导致环境混乱。本文总结了 SourceTree 无法拉取代码的问题,排查了环境变量、Git 全局配置及系统代理设置,最终通过清除 Git 代理配置解决。内容涵盖排查步骤、命令整理及脚本处理,帮助快速定位并解决代理相关网络问题。
432 3
|
11月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
507 61
|
Linux C语言 iOS开发
C语言结合AWTK开发HTTP接口访问界面
这样,我们就实现了在C语言中使用libcurl和AWTK来访问HTTP接口并在界面上显示结果。这只是一个基础的示例,你可以根据需要添加更多的功能和优化。例如,你可以添加错误处理机制、支持更多HTTP方法(如POST、PUT等)、优化用户界面等。
659 82
|
11月前
|
C# 图形学 开发者
Unity开发中使用UnityWebRequest从HTTP服务器下载资源。
总之,UnityWebRequest就是游戏开发者手中的万能钓鱼竿,既可以获取文本数据,也能钓上图片资源,甚至是那声音的涟漪。使用UnityWebRequest的时候,你需要精心准备,比如确定URL、配置请求类型和头信息;发起请求;巧妙处理钓获的数据;还需要机智面对网络波澜,处理各种可能出现的错误。按照这样的过程,数据的钓取将会是一次既轻松愉快也效率高效的编程钓鱼之旅。
603 18
|
11月前
|
安全 Java Android开发
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
460 0
为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡
|
12月前
|
域名解析 监控 网络协议
21.7K star!再见吧花生壳,没有公网ip,也能搞定所有网络访问!内网穿透神器NPS
“nps”是一款强大的内网穿透工具,支持多种协议与功能。它无需公网IP或复杂配置,可实现远程桌面、文件共享和私有云搭建等。项目采用Go语言开发,具有高性能与轻量级特点,适用于远程办公、物联网管理等场景。其核心亮点包括零配置穿透、多级代理网络、实时流量监控及企业级安全特性。对比同类工具,“nps”在安装复杂度、协议支持和管理界面方面表现优异。项目地址:https://github.com/ehang-io/nps。
2680 12
|
XML JSON Linux
Reqable:跨平台HTTP开发与调试工具
Reqable是一款功能强大且易于使用的跨平台HTTP开发与调试工具,具有多平台支持、全面的HTTP请求构建与解析、请求历史记录和环境管理等功能。它简化了HTTP请求的构建、发送和响应分析过程,为开发者提供了极大的便利。通过Reqable,开发者可以更高效地进行HTTP开发和调试,提高工作效率和代码质量。
1072 26
|
人工智能 网络协议 API
开发效率翻倍!Apipost这些协议调试秘籍,从HTTP到金融报文全搞定
Apipost是一款强大的API研发管理工具,支持多种协议与数据格式,包括HTTP(s)、WebSocket、SSE、gRPC、TCP及金融协议(如ISO 8583、FIX)。它内置国密算法库,提供HTTP文件秒传、全局参数配置等实用功能。在SSE调试中,可轻松处理AI模型流式响应;WebSocket与Socket.IO实现高效实时通信;GraphQL支持可视化Query编写;TCP模块解决金融报文编码难题;gRPC则具备服务反射与流式调试能力。Apipost不仅简化了多协议切换的复杂性,还自动生成文档,显著提升开发效率,让开发者专注于核心业务逻辑。
|
存储 编解码 开发工具
Android平台毫秒级低延迟HTTP-FLV直播播放器技术探究与实现
本文详细探讨了在Android平台上实现HTTP-FLV播放器的过程。首先介绍了FLV格式的基础,包括文件头和标签结构。接着分析了HTTP-FLV传输原理,通过分块传输实现流畅播放。然后重点讲解了播放器的实现步骤,涵盖网络请求、数据解析、音视频解码与渲染,以及播放控制功能的设计。文章还讨论了性能优化和网络异常处理的方法,并总结了HTTP-FLV播放器的技术价值,尤其是在特定场景下的应用意义。
736 11