【问题标题】:Retrofit. POST with request body without response body改造。带有请求正文的 POST 没有响应正文
【发布时间】:2020-02-25 19:33:31
【问题描述】:

我尝试发布这些登录名和密码

{
    "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 响应。应该怎么做才对?

【问题讨论】:

  • 在 Postman 上显示您的回复以及为什么您将回调设为无效?
  • 为原始 json 传递 @body
  • @Ashish 我使用回调 void 因为响应正文为空。邮递员显示空的身体和状态:200

标签: android kotlin


【解决方案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 了解更多信息。

【讨论】:

  • 你能粘贴 throwable 的堆栈跟踪吗?
  • 我收到了这个错误CLEARTEXT communication to 'myUrl' not permitted by network security policy
  • 完美运行。谢谢!
【解决方案2】:

使用@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"
    ...>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-01
    • 2013-05-30
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 2022-01-07
    相关资源
    最近更新 更多