#android #retrofit2
#Android #retrofit2
Вопрос:
Итак, мой login.php скрипт работает просто отлично при отправке запроса в виде необработанного JSON в Postman, но отправка его в Android возвращает пустой ответ, и когда я пытаюсь передать его в UserResponse в методе update(), я получаю ‘Попытка вызвать виртуальный метод ‘java.lang.Строка com.alenpersic.hrvend.Сущности.Ошибка UserResponse.GetMessage() ‘ при нулевой ссылке на объект’. postman_request
Это внутри моего MainActivity.java
@Override
public void update(Observable o, Object arg){
UserResponse response = (UserResponse) arg;
Toast.makeText(this, response.getMessage(), Toast.LENGTH_SHORT).show();
if (response.getMessage().equals("Login successful.")){
Toast.makeText(this, "Prijava uspješna!", Toast.LENGTH_SHORT).show();
showMachineList();
}
else {
Toast.makeText(this, "Pogrešno korisničko ime i lozinka!", Toast.LENGTH_SHORT).show();
}
DataObservable.getInstance().deleteObserver(this);
showMachineList();
}
public void SignUp (View view){
User currentUser = new User(usernameEditText.getText().toString(), passwordEditText.getText().toString());
DataObservable.getInstance().addObserver(this);
LoginLoader controller = new LoginLoader();
controller.loadUser(controller.create(), currentUser);
}
WebServiceInterface.java
public interface WebServiceInterface {
@GET("machine/read.php")
Call<MachineResponse> getMachines();
@GET("machine/read_materials.php")
Call<RawMaterialsResponse> getRawMaterials(
@Query("id") String id
);
@Headers({"Content-Type: application/json"})
@POST("login.php")
Call<LoginResponse> sendUser(
@Body User user
);
LoginLoader.java
public class LoginLoader extends DataLoader {
public void loadUser(WebServiceInterface webserviceInterface, User user)
{
Call<LoginResponse> call = webserviceInterface.sendUser(user);
call.enqueue(this);
}
@Override
public void onResponse(Call call, retrofit2.Response response)
{
if(response.isSuccessful())
{
LoginResponse loginResponse = (LoginResponse) response.body();
UserResponse data = loginResponse.getData();
DataObservable.getInstance().notifyObserverWithResponse(data);
}
else
{
Log.d("MainActivity", response.errorBody().toString() " " response.message() " " response.raw());
}
}
LoginResponse.java
public class LoginResponse extends DataResponse {
UserResponse data;
public UserResponse getData(){
return data;
}
public void setData(UserResponse data){
this.data = data;
}
User.java
public class User {
@SerializedName("username")
@Expose
private String username;
@SerializedName("password")
@Expose
private String password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setMessage(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
Комментарии:
1. Было бы полезно, если бы у вас был пример json и проверьте, действительно ли Retrofit получает то, что вы ожидаете. Я знаю, что postman добавляет некоторые заголовки по умолчанию, без которых иногда серверы не могут справиться. Модернизация этого не делает, следовательно, вы можете получить что-то неожиданное.
2. Я добавил скриншот с примером JSON, который я отправляю. Как мне проверить, получил ли retrofit то, что я ожидаю?
3. Я бы использовал этот перехватчик ведения журнала
4. Итак, после добавления перехватчика ведения журнала я заметил, что ответ НЕ пустой. Более того, все именно так, как и должно быть, смотрите здесь . Но я все еще не знаю, почему метод update() выдает значение null :/
5. На опубликованном вами изображении я действительно не вижу поля
data
. Он там? Кроме того, вы запускаете это с включенной proguard?