簡體   English   中英

Android Java rest 調用在調試模式下傳遞正確的參數,但在簽名的 apk 中不傳遞

[英]Android Java rest call passes correct params in debug mode but not in signed apk

我不知道這兩個變體在發送 POST 請求方面有什么聯系。

我的用戶 class:

public class User {

    String name, pass, email;
    int level, exp, gold;
    Timestamp regDate, lastVisited;
    boolean loginStatus;

    public String getPass() {
        return pass;
    }

    public void setPass(String pass) {
        this.pass = pass;
    }

    public String getEmail() {
        return email;
    }

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

    public boolean getLoginStatus() {
        return loginStatus;
    }

    public void setLoginStatus(boolean loginStatus) {
        this.loginStatus = loginStatus;
    }

    public Timestamp getLastVisited() {
        return lastVisited;
    }

    public void setLastVisited(Timestamp lastVisited) {
        this.lastVisited = lastVisited;
    }

    public Timestamp getRegDate() {
        return regDate;
    }

    public void setRegDate(Timestamp regDate) {
        this.regDate = regDate;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }

    public int getExp() {
        return exp;
    }

    public void setExp(int exp) {
        this.exp = exp;
    }

    public int getGold() {
        return gold;
    }

    public void setGold(int gold) {
        this.gold = gold;
    }

    public User(String name, String pass) {
        this.name = name;
        this.pass = pass;
    }

    public User(String name, String pass, String email) {
        this.name = name;
        this.pass = pass;
        this.email = email;
    }

    public User(String name, boolean loginStatus, int level, int exp, int gold, Timestamp regDate, Timestamp lastVisited) {
        this.name = name;
        this.loginStatus = loginStatus;
        this.level = level;
        this.exp = exp;
        this.gold = gold;
        this.regDate = regDate;
        this.lastVisited = lastVisited;
    }
}

我有這樣的 retrofit 請求:

@POST("/login")
Call<String> checkLogin(@Body User user);

而這樣的 retrofit 調用:

@Override
public void checkLogin(final OnFinishedLoginListener onFinishedListener, String login, String passWhenLogin, List<String> usersLoggedOnCredential) {

Call<String> result = Api.getClient().checkLogin(new User(login, passWhenLogin));
result.enqueue(new Callback<String>() {
    @Override
    public void onResponse(Call<String> call, Response<String> response) {
        onFinishedListener.onFinishedLogin(response.body());
        usersLoggedOnCredential.add(login);
    }

    @Override
    public void onFailure(Call<String> call, Throwable t) {
        Log.e("checkLogin", t.toString());
        onFinishedListener.onFailureLogin(t);
    }
});

}

和服務器代碼:

@PostMapping("/login")
public String login(@RequestBody UserForCreateDto userForCreateDto) throws SQLException {  
    return usersDao.userExists(userForCreateDto.getName(), userForCreateDto.getPass(), conn);
}

public String userExists(String name, String pass, Connection connection) {
String passEncoded = "";
String result;

System.out.println("qqqqqqq " + name + " " + pass);

PasswordEncoder encoder = new BCryptPasswordEncoder();

PreparedStatement ps;
try {
    ps = connection.prepareStatement("select * from users where username='" + name + "'");
    ResultSet rs = ps.executeQuery();
    if (rs.next())
        passEncoded = rs.getString(3);
    if (encoder.matches(pass, passEncoded))
        result = "true";
    else
        result = "false";
} catch (Exception e) {
    System.out.println("aaaaaaaaaab");
    e.printStackTrace();
    return e.getMessage();
}
return result;

}

@Data
public class UserForCreateDto {

    private String name;
    private String pass;
    private String email;
    private int level;
    private int exp;
    private int gold;
}

在調試模式下,根據我作為響應輸入的內容,我分別得到真或假,但是當我簽署我的應用程序以發布到 Google Play 商店時,來自 Android 客戶端的通行證似乎沒有到達服務器,然后我得到錯誤: pass == null (名稱正確)。

為什么呢?

可能您的請求和響應模型被 Proguard 混淆了。 為了防止這種情況,請在 Proguard 中添加您的請求-響應類,並使用“保留”規則。

https://developer.android.com/studio/build/shrink-code

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM