Я создаю приложение аутентификации, у меня есть 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
. Как видите я тут должен вставить аргументы (клиент, эмайл, парлоь...) . Думаю понятно объяснил, можете помочь? Спасибо.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Подскажите пожалуйстаЕсть ли или как-то можно реализовать систему ответа в websocket на входящее сообщение
Добрый деньПочему то при создании JAX-rs конфиги создаюмя в классе а не в xml файле как это исправить:?
Создаю ViewPager с 3-мя вкладками, в первой вкладке есть listview, в который я добавляю 3 пункта c информацией и проблема состоит в том, что при переходе...