Документация нам говорит так:
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.javapublic 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.javapublic 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.javapublic 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.javapublic 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.