У меня есть приложение на андроид и почему-то, я кстати так и не понял почему, у меня не работает моя единственная кнопка, хотя все должно нормально работать я уже проверял как-бы, но при нажатии ничего не происходит. Вот мой класс mainactivity:
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.example.developer_4.test_login.data.model.Post;
import com.example.developer_4.test_login.data.remote.ApiUtils;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class LoginActivity extends AppCompatActivity {
private TextView mResponseTv;
private APIService mAPIService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
final EditText titleEt = findViewById(R.id.login);
final EditText bodyEt = findViewById(R.id.password);
Button submitBtn = findViewById(R.id.btn_submit);
mResponseTv = findViewById(R.id.tv_response);
mAPIService = ApiUtils.getAPIService();
submitBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String a = titleEt.getText().toString().trim();
String b = bodyEt.getText().toString().trim();
if(!TextUtils.isEmpty(a) && !TextUtils.isEmpty(b)) {
sendPost(a, b);
logs();
}
}
});
}
public void logs() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://мой-сайт/v1/login/")
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
retrofit.create(APIService.class);
}
public void sendPost(String login, String password) {
String a = "qwerty";
String b = "abcdef";
mAPIService.auth(new Post(login, password), a, b).enqueue(new Callback<Post>() {
@Override
public void onResponse(@NonNull Call<Post> call, @NonNull Response<Post> response) {
if (response.isSuccessful()) {
showResponse(response.body().toString());
Toast.makeText(LoginActivity.this, "post submitted to API.", Toast.LENGTH_LONG).show();
}
}
@Override
public void onFailure(Call<Post> call, Throwable t) {
Toast.makeText(LoginActivity.this, "Unable to submit post to API.", Toast.LENGTH_LONG).show();
}
});
}
public void showResponse(String response) {
if (mResponseTv.getVisibility() == View.GONE) {
mResponseTv.setVisibility(View.VISIBLE);
}
mResponseTv.setText(response);
}
}
вот мой интерфейс для работы с апи:
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.POST;
import retrofit2.http.Path;
public interface APIService {
@POST("{parameter_0}/{parameter_1}")
Call<Post> auth(@Body Post body, @Path("parameter_0") String p0 , @Path("parameter_1") String p1);
}
apiservice.java:
import com.example.developer_4.test_login.APIService;
public class ApiUtils
{
private ApiUtils() {}
public static final String BASE_URL = "https://мой сайт/";
public static APIService getAPIService() {
return RetrofitClient.getClient(BASE_URL).create(APIService.class);
}
}
может я не правильно настроил свой интерфейс, я уже не знаю что придумать, вот например если раньше я использовал всю информацию из этого ресурса: https://code.tutsplus.com/tutorials/sending-data-with-retrofit-2-http-client-for-android--cms-27845 если вы откроете этот сайт, то можете увидеть в конце статьи тестирование приложение то у меня получилось при нажатии на кнопку реализовать подобное, но дальше я попробовал сделать свой запрос на нужный мне адрес, и почему-то теперь вообще на сервер ничего не идет. Если кто знает в чем у меня ошибка то буду благодарен за помощь.
ApiUtils
Что это? Зачем? Почему? Что там внутри происходит?
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://мой-сайт/v1/login/")
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
retrofit.create(APIService.class);
А это вы для чего делаете? Собираете в билдере объект ретрофита, получаете инстанс вашего интерфейса и... ничего с ними не делаете? А откуда вы тогда берёте и инициализируете mAPIService
? А зачем делать это каждый раз при нажатии, если инициализировать нужно только один раз перед использованием?
Нужно делать так:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://мой-сайт/v1/login/")
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
APIService mAPIService = retrofit.create(APIService.class);
mAPIService.auth(/* */).enqueue(/* */);
Кнопка работает - не выполняется условие if (response.isSuccessful())
, а альтернативный случай Вы никак не обрабатываете. Добавьте обработку неудачного запроса (пример).
Адрес запроса складывается из BASE_URL
, заданного при создании клиента, и пути, указанного в аннотации метода интерфейса APIService
.
Плейсхолдеры подставляют значения в путь из @Path
параметров метода - и того у Вас формируется адрес запроса
BASE_URL + {parameter_0}/{parameter_1}
https://мой сайт/qwerty/abcdef
а должен быть https://мой-сайт/v1/login/
Измените APIService
так:
public interface APIService {
@POST("/v1/login")
Call<Post> auth(@Body Post body);
}
И, соответственно base url должен быть https://мой сайт/
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Написал проект, сделал в нем Firebase crashlitics, привязал его к своему основному email, теперь раскаиваюсьСтоит запилить новую функцию, наловить багов,...
есть приложение и оно как бы все работает, только не получается прикрутить bottomsheetbehavior - постоянно вылетает в строчке изменения состоянияПодскажите...
Я пишу приложение на Spring-bootКратко о задачи: пользователи будут заливать файлы исходного кода на сервер, и на сервере они будут компилироваться...
У меня вопрос, можно ли компилировать только, к примеру, один класс программыПросто проект огромный, и ждать пока скомпилируется на телефон...