Задать вопрос
  • Google developer console, зачем нужно создавать проект?

    Ivanq
    @Ivanq
    Знаю php, js, html, css
    Developer Console нужна для того, чтобы управлять всеми данными проекта. Проэкт будет заходить не под вашим аккаунтом. Проекту выдадут свой Project ID и Project Secret Code (логин и пароль). При обращении к Google API потребуются эти данные. Это нужно для того, чтобы к API нельзя обращаться от имени другого проекта.
    Ответ написан
    Комментировать
  • Как задать 2 типа формата для GSON?

    Ewintory
    @Ewintory
    Java / Android developer
    Я нашел ответ за 2 секунды
    stackoverflow.com/questions/15563155/gson-to-json-...

    new GsonBuilder().registerTypeAdapter(Date.class, new DateDeserializer());
    
    private static final String[] DATE_FORMATS = new String[] {
            "MMM dd, yyyy HH:mm:ss",
            "MMM dd, yyyy"
    };
    
    
    private class DateDeserializer implements JsonDeserializer<Date> {
    
        @Override
        public Date deserialize(JsonElement jsonElement, Type typeOF,
                JsonDeserializationContext context) throws JsonParseException {
            for (String format : DATE_FORMATS) {
                try {
                    return new SimpleDateFormat(format, Locale.US).parse(jsonElement.getAsString());
                } catch (ParseException e) {
                }
            }
            throw new JsonParseException("Unparseable date: \"" + jsonElement.getAsString()
                    + "\". Supported formats: " + Arrays.toString(DATE_FORMATS));
        }
    }
    Ответ написан
    6 комментариев
  • Retrofit, нужно ли использовать expire/max-age?

    enq3
    @enq3
    Android engineer at #ITX5
    Если посмотреть через веб-дебагер в том же хроме на заголовки запроса и ответа, то сервер возвращает куки в Set-Cookie. А в запросе уходит через Cookie.
    Следовательно:
    Call<Profile> getCurrentUser(@Header("Cookie") String cookieA);

    Dante Faustoff прав, срок жизни куки не нужен.
    Ответ написан
    Комментировать
  • Retrofit, нужно ли использовать expire/max-age?

    StFaustoff
    @StFaustoff
    jDev
    Достаточно только JSESSIONID(именно та куча символов)
    max-age вроде как говорит о длительности жизни печенек на стороне сервера, ну а Expires по видимому это дата создания сессии.
    Ответ написан
    4 комментария
  • Retrofit как авторизоваться?

    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.
    Ответ написан
    8 комментариев