You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin+Docker+PostgreSQL:Android应用如何调用HTTP GET并存储数据?

嘿,刚上手Kotlin+Android Studio开发是吧?先给你划个核心重点:Android应用绝对不能直接连接PostgreSQL数据库——这会把数据库的账号密码等敏感信息直接暴露在APK里,安全风险拉满。正确的姿势是先搭建一个后端服务,让后端去对接数据库,再给Android提供HTTP接口。下面一步步给你讲清楚:

第一步:搭建后端GET接口(必备前提)

你需要先写一个后端服务(比如用Spring Boot、Node.js、Python Flask都行),它的作用是连接PostgreSQL、查询Items表数据,再以JSON格式返回。这里给你举个Kotlin版Spring Boot的简单例子:

1. 配置PostgreSQL连接

在application.properties里填写数据库信息:

spring.datasource.url=jdbc:postgresql://你的数据库地址:5432/数据库名
spring.datasource.username=数据库用户名
spring.datasource.password=数据库密码
spring.jpa.hibernate.ddl-auto=none

2. 定义实体类对应Items表

@Entity
@Table(name = "Items")
data class Item(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: Long? = null,
    val name: String,
    val price: Double,
    val date: LocalDate
)

3. 写数据库操作接口

interface ItemRepository : JpaRepository<Item, Long>

4. 编写GET接口的控制器

@RestController
@RequestMapping("/api/items")
class ItemController(private val itemRepository: ItemRepository) {
    @GetMapping
    fun getAllItems(): List<Item> {
        return itemRepository.findAll()
    }
}

启动后端后,访问http://你的后端地址:端口/api/items就能拿到JSON格式的Items数据了。

第二步:Android端用Kotlin发起HTTP GET请求

Android推荐用Retrofit(适合RESTful接口)或者OkHttp做网络请求,这里用Retrofit+协程的组合,是Kotlin开发的主流方案:

1. 添加依赖

在app模块的build.gradle.kts(或build.gradle)里加入以下依赖:

dependencies {
    // Retrofit核心库
    implementation("com.squareup.retrofit2:retrofit:2.9.0")
    // Gson转换器,自动把JSON转成Kotlin数据类
    implementation("com.squareup.retrofit2:converter-gson:2.9.0")
    // 协程支持,用于异步网络请求
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
}

2. 定义对应后端JSON的数据类

data class Item(
    val id: Long?,
    val name: String,
    val price: Double,
    val date: String // 后端返回的日期一般是"2024-05-20"格式,先存String,后续可转LocalDate
)

3. 创建Retrofit接口

interface ItemApiService {
    @GET("/api/items")
    suspend fun getAllItems(): List<Item> // suspend关键字标记这是一个协程挂起函数
}

4. 初始化Retrofit实例

object RetrofitInstance {
    private const val BASE_URL = "http://你的后端地址:端口/" // 注意末尾要加斜杠

    val api: ItemApiService by lazy {
        Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(ItemApiService::class.java)
    }
}

5. 在页面中发起请求并处理数据

网络请求不能在主线程执行,用lifecycleScope绑定页面生命周期最方便:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 发起网络请求
        lifecycleScope.launch {
            try {
                val items = RetrofitInstance.api.getAllItems()
                // 请求成功,拿到数据后保存到应用本地
                saveItemsToLocal(items)
                // 更新UI,比如把数据显示到列表里
                updateItemUi(items)
            } catch (e: Exception) {
                // 请求失败,提示用户
                Toast.makeText(this@MainActivity, "加载失败:${e.message}", Toast.LENGTH_SHORT).show()
            }
        }
    }

    // 保存数据到本地的几种方式
    private fun saveItemsToLocal(items: List<Item>) {
        // 方式1:用SharedPreferences(适合少量数据)
        val sharedPref = getSharedPreferences("ItemsStorage", MODE_PRIVATE)
        val editor = sharedPref.edit()
        val gson = Gson()
        val itemsJson = gson.toJson(items)
        editor.putString("all_items", itemsJson)
        editor.apply()

        // 方式2:用Room数据库(适合大量数据、需要持久化查询)
        // 若用Room,需先添加Room依赖,定义Entity、Dao、Database类,再执行插入:
        // itemDao.insertAll(items)
    }

    // 更新UI示例
    private fun updateItemUi(items: List<Item>) {
        val textView = findViewById<TextView>(R.id.tv_item_list)
        textView.text = items.joinToString("\n") { "${it.name} - ¥${it.price} - ${it.date}" }
    }
}
第三步:添加必要权限

在AndroidManifest.xml里添加网络权限:

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

如果你的后端用的是HTTP而非HTTPS,还需要配置网络安全允许明文流量:

  1. 在res/xml下创建network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">你的后端IP或域名</domain>
    </domain-config>
</network-security-config>
  1. 在AndroidManifest.xml的application标签里引用:
<application
    ...
    android:networkSecurityConfig="@xml/network_security_config">
    ...
</application>
额外注意事项
  • 绝对不要把数据库的账号密码直接写在Android代码里,必须通过后端中转
  • 网络请求一定要处理异常情况(比如无网络、后端报错)
  • 数据持久化方式根据数据量选择:少量数据用SharedPreferences,大量数据用Room

内容的提问来源于stack exchange,提问作者Torrado36

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:12:44