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()
            }
        }
    }
目录
相关文章
|
1月前
|
存储 Java 编译器
Kotlin学习教程(八)
Kotlin学习教程(八)
|
1月前
|
Java 网络架构 Kotlin
kotlin+springboot入门级别教程,教你如何用kotlin和springboot搭建http
本文是一个入门级教程,介绍了如何使用Kotlin和Spring Boot搭建HTTP服务,并强调了Kotlin的空安全性特性。
60 7
kotlin+springboot入门级别教程,教你如何用kotlin和springboot搭建http
|
1月前
|
前端开发 Java API
vertx学习总结5之回调函数及其限制,如网关/边缘服务示例所示未来和承诺——链接异步操作的简单模型响应式扩展——一个更强大的模型,特别适合组合异步事件流Kotlin协程
本文是Vert.x学习系列的第五部分,讨论了回调函数的限制、Future和Promise在异步操作中的应用、响应式扩展以及Kotlin协程,并通过示例代码展示了如何在Vert.x中使用这些异步编程模式。
47 5
vertx学习总结5之回调函数及其限制,如网关/边缘服务示例所示未来和承诺——链接异步操作的简单模型响应式扩展——一个更强大的模型,特别适合组合异步事件流Kotlin协程
|
22天前
|
Java Kotlin
Kotlin学习教程(七)
《Kotlin学习教程(七)》主要介绍了Lambda表达式,这是一种匿名函数,广泛用于简化代码。文章通过与Java 8 Lambda表达式的对比,展示了Kotlin中Lambda的基本语法、参数声明、函数体定义及如何作为参数传递。示例包括按钮事件处理和字符串比较,突出了Lambda表达式的简洁性和实用性。
31 4
|
24天前
|
Java Kotlin 索引
Kotlin学习教程(三)
Kotlin学习教程(三)
16 4
|
24天前
|
Java Kotlin
Kotlin学习教程(二)
Kotlin学习教程(二)
34 4
|
24天前
|
安全 Java 编译器
Kotlin学习教程(一)
Kotlin学习教程(一)
34 4
|
1月前
|
Java Maven Kotlin
vertx的学习总结7之用kotlin 与vertx搞一个简单的http
本文介绍了如何使用Kotlin和Vert.x创建一个简单的HTTP服务器,包括设置路由、处理GET和POST请求,以及如何使用HTML表单发送数据。
33 2
vertx的学习总结7之用kotlin 与vertx搞一个简单的http
|
24天前
|
存储 Java API
Kotlin学习教程(六)
《Kotlin学习教程(六)》介绍了Kotlin中的注解、反射、扩展函数及属性等内容。注解用于添加元数据,反射支持运行时自省,扩展则允许为现有类添加新功能,无需修改原类。本文还详细解释了静态扩展的使用方法,展示了如何通过companion object定义静态部分,并对其进行扩展。
14 2
|
24天前
|
存储 设计模式 JSON
Kotlin学习教程(五)
《Kotlin学习教程(五)》介绍了Kotlin中的泛型、嵌套类、内部类、匿名内部类、枚举、密封类、异常处理、对象、单例、对象表达式、伴生对象、委托等高级特性。具体内容包括泛型的定义和类型擦除、嵌套类和内部类的区别、匿名内部类的创建、枚举类的使用、密封类的声明和用途、异常处理机制、对象和单例的实现、对象表达式的应用、伴生对象的作用以及类委托和属性委托的使用方法。通过这些内容,读者可以深入理解Kotlin的高级特性和设计模式。
16 1