java - 改造响应正文为空,但状态码为 200
问题描述
我想制作一个登录功能,我想制作一个登录功能,最初我看到响应代码显示 200,但是当我看到响应正文为空时。我仍然可以登录,但未保存登录的用户数据。我使用了 2 db MySql 和 SQLite,我使用了改造和共享偏好。这里是我的代码
API接口
public interface Api {
@FormUrlEncoded
@POST(Config.API_LOGIN_USER)
Call<UserOrtu> loginUser(
@Field("email") String email,
@Field("password") String password
);
PrefUtil.java
public class PrefUtil {
public static final String USER_SESSION = "user_session";
public static final String USER_STORAGE = "user_storage";
public static SharedPreferences getSharedPreferences(Context ctx){
return PreferenceManager.getDefaultSharedPreferences(ctx);
}
public static void putUser(Context ctx, String key, UserOrtu user){
Gson gson = new Gson();
String json = gson.toJson(user);
putString(ctx, key, json);
}
public static UserOrtu getUser(Context ctx, String key){
Gson gson = new Gson();
String json = getString(ctx, key);
UserOrtu user = gson.fromJson(json, UserOrtu.class);
return user;
}
public static void putString(Context ctx, String key, String value){
getSharedPreferences(ctx).edit().putString(key, value).apply();
}
public static String getString(Context ctx, String key){
return getSharedPreferences(ctx).getString(key, null);
}
public static void clear(Context ctx) {
getSharedPreferences(ctx).edit().clear().apply();
}
}
模型 UserOrtu.java
public class UserOrtu {
@SerializedName("id_user")
@Expose
private int idUser;
@SerializedName("nama")
@Expose
private String nama;
@SerializedName("email")
@Expose
private String email;
@SerializedName("password")
@Expose
private String password;
@SerializedName("error")
@Expose
private Boolean error;
@SerializedName("message")
@Expose
private String message;
public int getIdUser() {
return idUser;
}
public void setIdUser(int idUser) {
this.idUser = idUser;
}
public String getNama() {
return nama;
}
public void setNama(String nama) {
this.nama = nama;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Boolean getError() {
return error;
}
public void setError(Boolean error) {
this.error = error;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
SignInActivity.java
公共类 SignInActivity 扩展 AppCompatActivity {
@BindView(R.id.input_email_signin)
TextInputEditText etEmail;
@BindView(R.id.text_register)
TextView tvRegister;
@BindView(R.id.input_password_signin)
TextInputEditText etPassword;
EmailValidator emailValidator;
PasswordValidator passwordValidator;
Context context;
private String email;
private String password;
private Api mApi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (isSessionLogin()){
startActivity(new Intent(this, MainActivity.class));
this.finish();
}
setContentView(R.layout.activity_sign_in);
ButterKnife.bind(this);
AndroidThreeTen.init(this);
mApi = RetrofitBuilder.builder(this).create(Api.class);
}
boolean isEmail(EditText text){
emailValidator = new EmailValidator();
String email = text.getText().toString();
return emailValidator.isValid(email);
}
boolean isPassword(EditText text){
passwordValidator = new PasswordValidator();
String pass = text.getText().toString();
return passwordValidator.isValid(pass);
}
@OnClick(R.id.text_register) void toRegister(){
Intent intent = new Intent(this, SignUpActivity.class);
startActivity (intent);
}
@OnClick(R.id.btn_signin) void onLogin(){
if(isEempty(etEmail)){
etEmail.setError("Email harus diisi");
}else if(isEempty(etPassword)){
etPassword.setError("Password harus diisi");
}else if(!isEmail(etEmail)){
etEmail.setError("Email tidak valid");
}else if(!isPassword(etPassword)){
String str = passwordValidator.getString();
Toast.makeText(getApplicationContext(),str, Toast.LENGTH_SHORT).show();
}else {
loginAct();
}
}
void loginAct(){
email = etEmail.getText().toString();
password = etPassword.getText().toString();
final MaterialDialog dialog = DialogBuilder.showLoadingDialog(SignInActivity.this, "Updating Data", "Please wait..", false);
mApi.loginUser(email, password).enqueue(new Callback<UserOrtu>() {
@Override
public void onResponse(Call<UserOrtu> call, Response<UserOrtu> response) {
UserOrtu user = response.body();
Log.i("USER_LOGIN", response.message());
if (user != null){
//Masih error disini
//if (!user.getError()){
PrefUtil.putUser(getApplicationContext(), PrefUtil.USER_SESSION, user);
Intent intent = new Intent(SignInActivity.this, MainActivity.class);
startActivity(intent);
//this.finish();
//}
Toast.makeText(getApplicationContext(), user.getMessage(), Toast.LENGTH_SHORT).show();
}
if (response.code() == 403){
etPassword.requestFocus();
etPassword.setError(getString(R.string.error_password));
}
if (response.code() == 404){
etEmail.requestFocus();
etEmail.setError(getString(R.string.error_login));
}
dialog.dismiss();
}
@Override
public void onFailure(Call<UserOrtu> call, Throwable t) {
//Toast.makeText(getActivity(), t.getMessage(), Toast.LENGTH_SHORT).show();
dialog.dismiss();
Log.i("USER_LOGIN", t.getMessage());
DialogBuilder.showErrorDialog(SignInActivity.this, "Gagal Login");
}
});
}
// this method to check is user logged in ?
boolean isSessionLogin(){
return PrefUtil.getUser(getApplicationContext(), PrefUtil.USER_SESSION) != null;
}
}
这是我的结果 在此处输入图像描述
这是我的 JSON 请求 在此处输入图像描述
解决方案
您的模型表示的数据与 JSON 中的数据不同。只有当UserOrtu
您的响应具有如下结构时,它才会起作用:
{
"id":1,
"nama": "Name",
"email":"email",
"message":"msg"
}
但正如您所见,前 3 个字段位于另一个对象内data
。所以你的模型应该看起来更像:
class LoginResponse{
@SerializedName("data")
@Expose
private UserOrtu userData;
@SerializedName("message")
@Expose
private String message;
}
推荐阅读
- python - Python:使用for循环制作万无一失的输入法时出错
- ruby-on-rails - 通过控制台仅查看rails中与模型相关的一项数据
- angular - 发生未处理的异常:找不到模块“@angular-devkit/build-angular/package.json”需要堆栈:
- r - 用变量和年份分隔列名
- java - 由于错误的模式类型(JSON 而不是 AVRO),Pulsar 函数无法反序列化消息
- kdb - 将空日期 0Nd 添加到 kdb 中空单元格的日期列
- testing - 无法使用创建的用户帐户和密码连接到数据库
- amazon-web-services - 如何为 terraform destroy 提供变量?
- web-services - 是否可以使用 Polarion Webservices 访问 Polarion 的所有数据
- python - 对 google sheet 工作表中的工作表进行排序