retrofit аутентификация не работает.

302
29 января 2018, 05:49

Я создаю приложение аутентификации, у меня есть 3 методы, первый регистрирует юзера, второй получает client id and secret, а третий получает access and refresh token. Все работает кроме третьего. Давайте посмотрим код, я добавлю только интерфейс, класс ретрофита и главный класс. Вот интерфейс.

public interface SupportopApi {
@POST("/api/registration")
Call<ResponseBody> registration(@Body SupportopObj supportopObj);
@POST("/api/getClientCD")
Call<ResponseBody> activate(@Body SupportopObjActivate activate);
@GET("/api/token")
Call<ResponseBody> getToken(@Query("grant_type") String grant_type,
                            @Query("client_id") String client_id,
                            @Query("client_secret") String client_secret,
                            @Query("email") String email,
                            @Query("password") String password);}

Видите у меня есть 3 запроса. Смотрите 3ий запрос. Все нормально? Тогда вперед. Вот класс ретрофита.

public class ApiClient {
private static ApiClient instance;
private SupportopApi supportopApi;
private ApiClient(String endpoint) {
    OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder()
            .readTimeout(10, TimeUnit.SECONDS)
            .connectTimeout(10, TimeUnit.SECONDS)
            .writeTimeout(10, TimeUnit.SECONDS);
    clientBuilder.addInterceptor(new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            request = request.newBuilder()
                    .addHeader("Content-Type", "application/json")
                    .build();
            return chain.proceed(request);
        }
    });
    supportopApi = new Retrofit.Builder()
            .baseUrl(endpoint)
            .client(clientBuilder.build())
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(SupportopApi.class);
}

public static synchronized void initializeInstance(String endpoint) {
    if (instance == null) {
        instance = new ApiClient(endpoint);
    }
}

public static synchronized ApiClient getInstance() {
    if (instance == null) {
        throw new IllegalStateException("PentairAPIClient has not been initialized.");
    }
    return instance;
}

public Call<ResponseBody> registration(SupportopObj supportopObj) {
    return supportopApi.registration(supportopObj);
}

public Call<ResponseBody> activation(SupportopObjActivate activate){
    return supportopApi.activate(activate);
}

public Call<ResponseBody> get_token(String grant_type, String client_id, String client_secret,
                                   String email, String password){
    return supportopApi.getToken(grant_type, client_id, client_secret, email, password);
}}

Смотрите последные 3 запроса. Все норм? Тогда вперед. И вот главный класс, я использую фрагменты.

public class FragmentRegistration extends Fragment {
View mainView;
EditText username, email, password, name;
Button button;
ApiClient pentairAPIClient = ApiClient.getInstance();
SupportopObj supportopObj = new SupportopObj();
SupportopObjActivate supportopObjActivate = new SupportopObjActivate();
@Override
public View onCreateView(LayoutInflater inflater,
                         @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    mainView = inflater.inflate
            (R.layout.registration, container, false);
    username = mainView.findViewById(R.id.username);
    email = mainView.findViewById(R.id.email);
    password = mainView.findViewById(R.id.password);
    name = mainView.findViewById(R.id.name);
    button = mainView.findViewById(R.id.register);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            supportopObj.setFirstName("Tester");
            supportopObj.setLastName("Testryan");
            supportopObj.setUsername(username.getText().toString());
            supportopObj.setEmail(email.getText().toString());
            supportopObj.setPassword(password.getText().toString());
            supportopObjActivate.setUsername(supportopObj.getUsername());
            supportopObjActivate.setEmail(supportopObj.getEmail());
            supportopObjActivate.setPassword(supportopObj.getPassword());
            supportopObjActivate.setType("generic");
            updateApp();                
        }
    });
    return mainView;
}

public void updateApp() {
    Call<ResponseBody> call = pentairAPIClient.registration(supportopObj);
    call.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            if (response.isSuccessful()) {
                activationCall();
            } else {
                Toast.makeText(getContext(), "Something went wrong",
                        Toast.LENGTH_SHORT).show();
            }
        }
        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            Toast.makeText(getContext(), "Error...", Toast.LENGTH_SHORT).show();
        }
    });
}

public void activationCall() {
    Call<ResponseBody> callActive = pentairAPIClient.activation(supportopObjActivate);
    callActive.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            if (response.isSuccessful()) {
                try {
                    String data = response.body().string();
                    JSONObject obj = new JSONObject(data);
                    String client_id = obj.getString("client_id");
                    String client_secret = obj.getString("client_secret");
                    tokenCall(client_id, client_secret);
                } catch (JSONException | IOException e) {
                    e.printStackTrace();
                }
            } else {
                Toast.makeText(getContext(), "error", Toast.LENGTH_SHORT).show();
            }
        }
        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            Toast.makeText(getContext(), "Error in activation",
                    Toast.LENGTH_SHORT).show();
        }
    });
}

public void tokenCall(String client_id, String client_secret) {
    Call<ResponseBody> token = pentairAPIClient.get_token("password", client_id, client_secret,
            supportopObjActivate.getEmail(), supportopObjActivate.getPassword());
    token.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            if (response.isSuccessful()) {
                Toast.makeText(getContext(), String.valueOf(response.body()), Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(getContext(), "Something wrong.....", Toast.LENGTH_SHORT).show();
            }
        } -----------------------------  LINE 144
        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            Toast.makeText(getContext(), "You're on failure", Toast.LENGTH_SHORT).show();
        }
    });
}}

Так вы видите 3 метода? public void updateApp() регистрирует. public void activationCall() получает clientId and secret, public void tokenCall() получает access and refresh token. 3ий метод не работает. Давайте объясню. Так когда я вставлю breakpoint на Call<ResponseBody> token и token.enqueue(new Callback<ResponseBody>(), я в режиме отладки вижу, что они получают все мои аргументы при вводе (эмайл, пароль, имя...) . Но когда делаю отладку шаг за шагом, то после token.enqueue(new Callback<ResponseBody>() он должен переместиться на следующую строку public void onResponse. Но после token.enqueue(new Callback<ResponseBody>() оно прыгает на линию 144 (смотрите класс фрагмента это в конце.) Когда я комментирую updateApp() метод и даю аргументы напрямую, то так работает. Например вот смотрите Call<ResponseBody> token = pentairAPIClient.get_token("password", "email@mail.ru", "pass" );.

Вот ссылка тестового сервера https://supportop.eu-gb.mybluemix.net/api/token?grant_type=password&client_id={your client id}&client_secret={your client secret}&email={your email}&password=password. Как видите я тут должен вставить аргументы (клиент, эмайл, парлоь...) . Думаю понятно объяснил, можете помочь? Спасибо.

READ ALSO
Ответ на сообщение WebSocket

Ответ на сообщение WebSocket

Подскажите пожалуйстаЕсть ли или как-то можно реализовать систему ответа в websocket на входящее сообщение

172
JAX-RS не создает deployment descripot

JAX-RS не создает deployment descripot

Добрый деньПочему то при создании JAX-rs конфиги создаюмя в классе а не в xml файле как это исправить:?

138
Неправильное отображение фрагмента во ViewPager

Неправильное отображение фрагмента во ViewPager

Создаю ViewPager с 3-мя вкладками, в первой вкладке есть listview, в который я добавляю 3 пункта c информацией и проблема состоит в том, что при переходе...

195