Переоборудование. POST с телом запроса без тела ответа - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь отправить эти логин и пароль

{
    "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>
}

А вот Retrofit:

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. Как мне сделать это правильно?

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Используйте @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"
    ...>
1 голос
/ 30 октября 2019

Используя 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: HTTP-трафик в открытом тексте запрещен Вариант 2 для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...