[英]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 中添加您的請求-響應類,並使用“保留”規則。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.