Retrofit 2.0 не может войти с помощью запроса - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь использовать Retrofit 2.0 для входа на сайт. Это мой первый раз с Retrofit. Однако с почтальоном и с сайта я могу успешно войти в систему. Это запрос в хром: enter image description here

И это мой код:

APIService:

interface APIService {

    @FormUrlEncoded
    @POST("/account/")
    fun login(@Field ("login-ident") username:String,
              @Field ("login-pwd") password:String): Call<String>

}

MainActivty:

    fun login(username:String, password:String) {
    mAPIService?.login(username, password)?.enqueue(object : Callback<String> {
        override fun onResponse(call: Call<String>, response: Response<String>) {
            if (response.isSuccessful()) {
                showResponse(response.body().toString())
                Log.e("Tag", "post submitted to API.")
            }
        }

        override fun onFailure(call: Call<String>, t: Throwable) {
            Log.e("Tag", "Unable to submit post to API. - "+t.message)
        }
    })
}

fun showResponse(response: String) {
    Log.e("Tag", response)
}

По сути, когда я запускаю свой запрос, в теле ответа я получаю страницу входа в систему, тогда как с помощью chrome или почтальона я получаю страницу пользователя (и это то, что я хочу). Что я делаю не так? Спасибо: D

UPDATE:

Это сгенерированный код почтальона (и он работает, но мой запрос на модернизацию не работает):

    POST /account/ HTTP/1.1
Host: www.placeoldersite.it
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Cache-Control: no-cache
Postman-Token: postman token

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="login-ident"

myusername
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="login-pwd"

mypassword
------WebKitFormBoundary7MA4YWxkTrZu0gW--

ОБНОВЛЕНИЕ 2:

Я делаю небольшой скрипт на Python, и он работает, но мой запрос на модернизацию не работает D:

    import requests
url = "https://www.myplaceholder.it/account/"
data = {"login-ident":"username", "login-pwd":"password"}

r = requests.post(url, data=data)

print(r.content)

ОБНОВЛЕНИЕ 3:

Я думаю, что проблема в том, что в моем коде Retrofit не обрабатывает куки (в данном случае один куки), и я не могу выполнить вход

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Пожалуйста, удалите / из @POST ("/ account /") <- затем попробуйте </p>

@FormUrlEncoded
    @POST("/account")
    fun login(@Field ("login-ident") username:String,
              @Field ("login-pwd") password:String): Call<String>

Надеюсь, это сработает. :)

0 голосов
/ 29 июня 2018

Я бы порекомендовал обернуть код в объект, который также легче обрабатывать, а затем использовать конвертер-адаптер, такой как GSON или Moshi, для преобразования ответа. Например:

data class LoginModel(@SerializedName("login-ident") val userName: String,
                      @SerializedName("login-pwd") val password: String)

и передайте это функции входа в систему как параметр @Body и вашему сервису. Если LoginModel должен быть инкапсулирован в объекте data в json, то вы можете создать класс-оболочку, иначе объявление может быть:

interface LoginService {
    @POST("account")
    fun login(@Body loginModel: LoginModel): Call<String>
}

и тогда это будет лучше с вызовом дооснащения. Также убедитесь, что вы получаете строку в ответ от сервера, если это JSONObject. Я снова рекомендую использовать оболочку data class LoginResponseModel и определить структуру json как объект, который может быть проанализирован с помощью GSON или * 1015. *. Надеюсь, это поможет:)

0 голосов
/ 29 июня 2018

Модернизация добавляет '/' в путь самостоятельно. попробуйте с @POST ("account")

...