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,还需要配置网络安全允许明文流量:
- 在
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>
- 在
AndroidManifest.xml的application标签里引用:
<application ... android:networkSecurityConfig="@xml/network_security_config"> ... </application>
额外注意事项
- 绝对不要把数据库的账号密码直接写在Android代码里,必须通过后端中转
- 网络请求一定要处理异常情况(比如无网络、后端报错)
- 数据持久化方式根据数据量选择:少量数据用SharedPreferences,大量数据用Room
内容的提问来源于stack exchange,提问作者Torrado36
相关产品推荐
相关产品推荐

