Chuffey
@Chuffey
java-middle developer

Retrofit как авторизоваться?

Есть рест сервис, авторизация работает вот таким образом:

restservice.ru/api/login?username=abc&password=12345
дальше она поддерживается через куки:
JSESSIONID = "BLABLABLA",

Вопрос:
Как авторизоваться используя Retrofit,
и в дальнейшем подставлять куки полученные при авторизации, в дальнейшие запросы к сервису ?

P.S. Заранее спасибо!
  • Вопрос задан
  • 4754 просмотра
Решения вопроса 1
enq3
@enq3
Android engineer at #ITX5
Документация нам говорит так:
A request Header can be updated dynamically using the @Header annotation. A corresponding parameter must be provided to the @Header. If the value is null, the header will be omitted. Otherwise, toString will be called on the value, and the result used.
@GET("/user")
Call<User> getUser(@Header("Authorization") String authorization)

Вообщем берем случай, когда апи нет как такового, и надо залогиниться на сайт отправив запрос, как будто мы веб-клиент.
Подопытный kotomatrix.ru.

При парсинге запросов выяснилось, что авторизация происходит через отправку формы.
KotomatrixService.java
public interface KotomatrixService {
    @FormUrlEncoded
    @POST("http://kotomatrix.ru")
    Call<String> login(@Field("login") String login, @Field("password") String pass, @Field("act") String act, @Field("remember") String remember);
}


ApiFactory.java
public class ApiFactory {
    private static final int CONNECT_TIMEOUT = 15;
    private static final int WRITE_TIMEOUT = 60;
    private static final int TIMEOUT = 60;
    private static final OkHttpClient CLIENT = new OkHttpClient();

    static {
        CLIENT.setConnectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS);
        CLIENT.setWriteTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS);
        CLIENT.setReadTimeout(TIMEOUT, TimeUnit.SECONDS);
    }

    @NonNull
    public static KotomatrixService getKotomatrixService() {
        return getRetrofit().create(KotomatrixService.class);
    }

    @NonNull
    private static Retrofit getRetrofit() {
        return new Retrofit.Builder()
                .baseUrl("http://kotomatrix.ru")
                .addConverter(String.class, new StringConverter())
                .client(CLIENT)
                .build();
    }
}


StringConverter.java
public final class StringConverter implements Converter<String> {
    @Override
    public String fromBody(ResponseBody body) throws IOException {
        return body.string();
    }

    @Override
    public RequestBody toBody(String value) {
        return RequestBody.create(MediaType.parse("text/plain"), value);
    }
}


MainActivity.java
public class MainActivity extends AppCompatActivity implements Callback<String> {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        KotomatrixService service = ApiFactory.getKotomatrixService();
        Call<String> call = service.login("testUser", "testUser", "login", "true");
        call.enqueue(MainActivity.this);
    }

    @Override
    public void onResponse(Response<String> response) {
        if (response.isSuccess()) {
            // ищем куку и сохраняем
        }
    }

    @Override
    public void onFailure(Throwable t) {
    }
}


В данном примере при успешной авторизации сервер отдаст kotomatrixCOOK, ищем значение тут response.rawResponse.headers и сохраняем в SharedPreferences.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы