Дооснащение всегда откликом на onFailure - PullRequest
0 голосов
/ 10 июня 2019

Я настраиваю новый проект Android и использую модификацию, моя функция модернизации работает правильно в эмуляторе (NOX) и почтальоне, но когда я пытаюсь собрать свое приложение на мобильном устройстве, модификация всегда попадает в onFailure, может кто-нибудь дать мне решение?Мой API опубликован на общедоступном хостинге,

Так я называю модификацию

 private APIInterface getInterfaceService() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        final APIInterface mInterfaceService = retrofit.create(APIInterface.class);
        return mInterfaceService;
    }

 private void loginInterface(final String username, final String password){
        APIInterface mApiService = this.getInterfaceService();
        Call<Response> mService = mApiService.loginRequest(username,password);
        mService.enqueue(new Callback<Response>() {
            @Override
            public void onResponse(Call<Response> call, retrofit2.Response<Response> response) {
                if(response.body().getValue()==1){
                    Toast.makeText(Login.this,"Welcome",Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(getApplicationContext(),HomePage.class);
                    startActivity(intent);
                    finish();
                }else{
                    Toast.makeText(Login.this,"Invalid Username or Password",Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onFailure(Call<Response> call, Throwable t) {
                Toast.makeText(Login.this,t.getMessage(),Toast.LENGTH_SHORT).show();
            }
        });
    }

Мой ответ

 public class Response {

    @SerializedName("value")
    @Expose
    private Integer value;
    @SerializedName("result")
    @Expose
    private List<User> result = null;

    public Integer getValue() {
        return value;
    }

    public void setValue(Integer value) {
        this.value = value;
    }

    public List<User> getResult() {
        return result;
    }

    public void setResult(List<User> result) {
        this.result = result;
    }

}

Модель пользователя

 public class User {
    @SerializedName("id")
    @Expose
    private String id;
    @SerializedName("username")
    @Expose
    private String username;
    @SerializedName("password")
    @Expose
    private String password;
    @SerializedName("email")
    @Expose
    private String email;
    @SerializedName("image")
    @Expose
    private Object image;
    @SerializedName("point")
    @Expose
    private String point;
    @SerializedName("reputation")
    @Expose
    private String reputation;
    @SerializedName("role")
    @Expose
    private String role;

    public User(String id, String username, String password, String email, Object image, String point, String reputation, String role) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.email = email;
        this.image = image;
        this.point = point;
        this.reputation = reputation;
        this.role = role;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Object getImage() {
        return image;
    }

    public void setImage(Object image) {
        this.image = image;
    }

    public String getPoint() {
        return point;
    }

    public void setPoint(String point) {
        this.point = point;
    }

    public String getReputation() {
        return reputation;
    }

    public void setReputation(String reputation) {
        this.reputation = reputation;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }
}

Интерфейс API

public interface APIInterface {
    @FormUrlEncoded
    @POST("login.php")
    Call<Response> loginRequest(@Field("username") String username,
                            @Field("password") String password);
}

Я получил это сообщение от t.message 'Связь CLEARTEXT с {мой api url} не разрешена политикой безопасности сети'

После добавления этого в манифест

android:usesCleartextTraffic="true"

Я получил этот новый 'java.lang.IllegalStateException: ожидаемый BEGIN_OBJECT, но он был STRING в строке 1, путь 1 столбца $'

Мой JSON-ответ похож на

{"value":1,"result":[{"id":"1","username":"username","password":"password","email":"email","image":null,"point":"0","reputation":"0","role":"2"}]}

Это мой ответ почтальона

enter image description here

Ответы [ 3 ]

0 голосов
/ 10 июня 2019

используйте этот сайт для генерации правильного класса ответа в java

ваш класс ответа должен быть таким:

public class Response implements Serializable
{

@SerializedName("value")
@Expose
private long value;
@SerializedName("result")
@Expose
private List<Result> result = null;
private final static long serialVersionUID = -7121130042760098410L;

public long getValue() {
return value;
}

public void setValue(long value) {
this.value = value;
}

public List<Result> getResult() {
return result;
}

public void setResult(List<Result> result) {
this.result = result;
}

}
-----------------------------------com.example.Result.java-----------------------------------

package com.example;

import java.io.Serializable;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Result implements Serializable
{

@SerializedName("id")
@Expose
private String id;
@SerializedName("username")
@Expose
private String username;
@SerializedName("password")
@Expose
private String password;
@SerializedName("email")
@Expose
private String email;
@SerializedName("image")
@Expose
private Object image;
@SerializedName("point")
@Expose
private String point;
@SerializedName("reputation")
@Expose
private String reputation;
@SerializedName("role")
@Expose
private String role;
private final static long serialVersionUID = 7267197789545166983L;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public Object getImage() {
return image;
}

public void setImage(Object image) {
this.image = image;
}

public String getPoint() {
return point;
}

public void setPoint(String point) {
this.point = point;
}

public String getReputation() {
return reputation;
}

public void setReputation(String reputation) {
this.reputation = reputation;
}

public String getRole() {
return role;
}

public void setRole(String role) {
this.role = role;
}

}
0 голосов
/ 10 июня 2019

Вещи, которым вы должны следовать всякий раз, когда вы пытаетесь использовать Retrofit Library в вашем проекте.

  1. Преобразуйте ваш ответ в POJO, используя этот Веб-сайт .Нужен пример, тогда посмотрите этот Ответ .
  2. Ваш BASE URL должен заканчиваться на '/'.

      String BASEURL = "http://www.xxxxxxxx.com/"
    
  3. Когда выРеализация обратного вызова модернизации.Вам нужно проверить, что ваш ответ дает вам 200, отметив if(response.isSuccessful()).

     mService.enqueue(new Callback<Response>() {
            @Override
            public void onResponse(Call<Response> call, retrofit2.Response<Response> response) {
            if(response.isSuccessful()){
               if(response.body().getValue()==1){
                    Toast.makeText(Login.this,"Welcome",Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(getApplicationContext(),HomePage.class);
                    startActivity(intent);
                    finish();
                }else{
                    Toast.makeText(Login.this,"Invalid Username or Password",Toast.LENGTH_SHORT).show();
                }
              }else   Toast.makeText(Login.this,response.errorBody().string(),Toast.LENGTH_SHORT).show(); // this will tell you why your api doesnt work most of time
            }
    
            @Override
            public void onFailure(Call<Response> call, Throwable t) {
                Toast.makeText(Login.this,t.getMessage(),Toast.LENGTH_SHORT).show();
            }
        });
    
  4. Как я вижу, вы используете класс Response.Ответ имеет так много предопределенных объектов, а другие библиотеки также имеют имя Response.Итак, вам нужно проверить файл импорта, чтобы перекрестно убедиться, что вы используете свой объект ответа с именем пакета, а не с другим объектом ответа.

  5. Как и в вашем POSTMAN, вы включаете 9 заголовков.Вы должны найти все 9 примеров модернизации заголовков и соответственно добавить их в свой интерфейс API.

Примечание: - Следуйте этим инструкциям, я думаю, что вы решите свою проблему самостоятельно.

Не стесняйтесь задавать любые вопросы после исправления всех вышеприведенных инструкций.

0 голосов
/ 10 июня 2019

Вы установили правильный IP-адрес?

Если он работает правильно с почтальоном и эмулятором, значит, ваш код работает довольно хорошо. Однако убедитесь, что вы установили правильную конечную точку (или BASE_URL в вашем случае)

OR

Если вы используете ProGuard, убедитесь, что вы отключили его, просто чтобы убедиться, что все работает хорошо без Proguard.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...