我尝试发布这些登录名和密码
{
"userLogin": "Mark",
"userPassword": "Pencil"
}
根据POSTMAN,我将JSON放在上面作为原始代码,我得到了一个空的响应主体和响应代码:200(成功登录)。但是我无法在Android Studio中实现。这是一个API接口
interface LoginService {
@POST("login")
fun userLogin(
@Query("userLogin") userLogin: String,
@Query("userPassword") userPassword: String
):Call<Void>
}
这是改造:
fun checkLoginData() {
val retrofit = Retrofit.Builder()
.baseUrl("myurl...")
.addConverterFactory(GsonConverterFactory.create())
.build()
val service = retrofit.create(LoginService::class.java)
val call = service.userLogin("Mark", "Pencil")
call.enqueue(object : Callback<Void>{
override fun onResponse(call: Call<Void>, response: Response<Void>) {
if(response.code() == 200){
Toast.makeText(applicationContext,"Logged in", Toast.LENGTH_SHORT).show()
}
}
override fun onFailure(call: Call<Void>, t: Throwable) {
Toast.makeText(applicationContext,"Error", Toast.LENGTH_SHORT).show()
}
})
}
我想我的LoginService
的创建不正确,因为总是存在onFailure响应。我应该如何正确做?
答案 0 :(得分:1)
使用POST,您可能不会使用@Query,而是使用@Body。例如
data class LoginRequest(
val userLogin: String,
val userPassword: String
)
并在您的界面中:
@POST("login")
fun userLogin(@Body request: LoginRequest):Call<Void>
编辑:
由于这是ClearText的问题:
您需要将android:usesCleartextTraffic="true"
添加到您的AndroidManifest中。
参考
Android 8: Cleartext HTTP traffic not permitted
选项2了解更多信息。
答案 1 :(得分:1)
使用@Body而不是@Query
@Headers("Content-Type: application/json")
@POST("login")
fun userLogin(@Body rawParams: String):Call<Void>
然后您可以创建这样的参数
val params= JSONObject()
params.put("userLogin","Mark")
params.put("userPassword","Pencil")
上次更改
val call = service.userLogin(params.toString())
明文错误解决方案是 创建文件
res/xml/network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
然后添加清单
<application
android:networkSecurityConfig="@xml/network_security_config"
...>