Отправка JSON на сервер возвращает пустой ответ, но он отлично работает в Postman

#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?