Android登录功能报错:Cannot resolve symbol 'username' 求解决方案
解决步骤
先修复编译错误
你在loginUser(LoginRequest loginRequest)方法里调用ApiClient.getService().loginUser(username)时,username变量未定义,直接从传入的loginRequest对象中获取即可:
Call<LoginResponse> loginResponseCall = ApiClient.getService().loginUser(loginRequest.getUsername());
完善登录逻辑(解决只验证用户名的漏洞)
当前代码仅验证用户名,不符合登录场景需求,需要同时验证用户名和密码,以下是完整调整方案:
1. 修改后端API验证逻辑
更新GetuserName方法,添加密码参数并修改SQL查询条件:
[HttpGet] public IHttpActionResult GetuserName(string username, string password) { List<People> list = new List<People>(); using (SqlCommand com = new SqlCommand("Select LoginID, PersonEye, username, password from tblLogin where username = @name AND password = @pwd", mainconn)) { mainconn.Open(); com.Parameters.Add("@name", SqlDbType.VarChar).Value = username; com.Parameters.Add("@pwd", SqlDbType.VarChar).Value = password; using (SqlDataReader dr = com.ExecuteReader()) { while (dr.Read()) { list.Add(new People() { LoginID = Convert.ToInt32(dr.GetValue(0)), PersonEye = Convert.ToString(dr.GetValue(1)), username = Convert.ToString(dr.GetValue(2)), password = Convert.ToString(dr.GetValue(3)) }); } } return Ok(list); } }
2. 更新前端Retrofit接口
修改UserService,支持传递用户名和密码两个参数,并修正接口路径:
public interface UserService { @GET("Person/GetuserName") Call<LoginResponse> loginUser(@Query("username") String username, @Query("password") String password); }
3. 调整前端调用逻辑
在loginUser方法中同时传入用户名和密码,并增加登录失败的判断:
public void loginUser(LoginRequest loginRequest) { Call<LoginResponse> loginResponseCall = ApiClient.getService().loginUser(loginRequest.getUsername(), loginRequest.getPassword()); loginResponseCall.enqueue(new Callback<LoginResponse>() { @Override public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) { if(response.isSuccessful()) { LoginResponse loginResponse = response.body(); if(loginResponse != null && loginResponse.getPeopleList() != null && !loginResponse.getPeopleList().isEmpty()) { startActivity(new Intent(MainActivity.this, Visitor.class).putExtra("data",loginResponse)); finish(); } else { Toast.makeText(MainActivity.this, "用户名或密码错误", Toast.LENGTH_LONG).show(); } } else { Toast.makeText(MainActivity.this, "请求失败,请稍后重试", Toast.LENGTH_LONG).show(); } } @Override public void onFailure(Call<LoginResponse> call, Throwable t) { String message = t.getLocalizedMessage(); Toast.makeText(MainActivity.this, message, Toast.LENGTH_LONG).show(); } }); }
4. 修正LoginResponse数据结构
当前LoginResponse字段与后端返回的List<People>不匹配,需修改:
public class LoginResponse { private List<People> peopleList; public List<People> getPeopleList() { return peopleList; } public void setPeopleList(List<People> peopleList) { this.peopleList = peopleList; } }
同时创建People类对应后端返回字段:
public class People { private int LoginID; private String PersonEye; private String username; private String password; public int getLoginID() { return LoginID; } public void setLoginID(int loginID) { LoginID = loginID; } public String getPersonEye() { return PersonEye; } public void setPersonEye(String personEye) { PersonEye = personEye; } 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; } }
内容的提问来源于stack exchange,提问作者Reborn
相关产品推荐
相关产品推荐

