自己切身实际开发中发现就三点是比较有疑问:1、安卓前端http请求工具的使用 2、前端如何构建请求 3、后端接口如何调用
1、安卓前端http请求工具
使用retrofit2 http请求工具来构造请求。
首先导入依赖。
implementation ("com.squareup.retrofit2:retrofit:2.9.0")
implementation ("com.squareup.retrofit2:converter-gson:2.9.0")
2、前端如何构建请求
创建api接口类,以我的项目为例,这里主要是配置请求路径和传递的参数。
import retrofit2.Call
import retrofit2.http.Body
import retrofit2.http.POST
import retrofit2.http.PUT
import retrofit2.http.Query
import java.lang.Thread.State
data class ScanData(
val scanData: String ,
val state: String)
data class User(
val username: String,
val password: String
)
//data class State(val state:String)
interface ApiService {
@POST("/pda")
fun submitScanData(@Body scanData: ScanData ): Call<ApiResponse<Any>>
@PUT("/pda/update")
fun submitOutboundData(@Body scanData: ScanData):Call<ApiResponse<Any>>
@POST("/user/login")
fun submitLogin(
@Query("username")username: String,
@Query("password")password: String
):Call<ApiResponse<Any>>
}
3、后端接口如何调用
创建retrofit实例,配置后端的路径和端口并导入apiService。
class MainActivity : ComponentActivity() {
private lateinit var apiService: ApiService
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Security.insertProviderAt(Conscrypt.newProvider(), 1)
enableEdgeToEdge()
// 创建 Retrofit 实例
val retrofit = Retrofit.Builder()
.baseUrl("yourhost") // 替换为你的 API 地址
.addConverterFactory(GsonConverterFactory.create())
.build()
apiService = retrofit.create(ApiService::class.java)
setContent {
PdaApplicationTheme {
AppNavigation(apiService)
}
}
}
}
按钮点击操着 发送http请求,以我的项目为例,这里传递的参数必须与apiService相对应,同时也要根据后端实体类来确定命名。
Button(
onClick = {
apiService.submitLogin(username = userName.text, password = passWord.text)
.enqueue(object : Callback<ApiResponse<Any>> {
override fun onResponse(
call: Call<ApiResponse<Any>>,
response: Response<ApiResponse<Any>>
) {
val apiResponse = response.body()
if (response.isSuccessful && apiResponse != null) {
if (apiResponse.code == 0) {
Toast.makeText(
context,
"登录成功",
Toast.LENGTH_SHORT
).show()
navController.navigate("main") {
popUpTo("login") { inclusive = true }
launchSingleTop = true
}
} else {
Toast.makeText(
context,
"登录失败: ${apiResponse.message}",
Toast.LENGTH_SHORT
).show()
}
} else {
Toast.makeText(
context,
"登录失败: ${response.message()}",
Toast.LENGTH_SHORT
).show()
}
}
override fun onFailure(call: Call<ApiResponse<Any>>, t: Throwable) {
Toast.makeText(
context,
"网络错误: ${t.message}",
Toast.LENGTH_SHORT
).show()
}
})
},
modifier = Modifier
.padding(16.dp)
.fillMaxWidth(0.6f)
.fillMaxHeight(0.15f)
) {
Text("登录")
}
总结:
请求协议,Android9开始使用加密通信,所以在生产环境中要进行权限释放,在AndroidManifest.xml加入以下配置
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
后端yml文件,配置允许全部端口访问,在局域网内,一定要开放权限。
server:
port: 8080
address: 0.0.0.0