使用改造库获取响应时出错
error getting response using retrofit library
我正在使用改造库来获取检查登录凭据我的 php 包含响应的文件如下
login.php
...
if ($user["invalid credentials"] != "true"){
$response["error"] = FALSE;
$response["id"] = $user["credentials"]["admin_id"];
$response["username"] = $user["credentials"]["username"];
$response["password"] = $user["credentials"]["password"];
$response["email"] = $user["credentials"]["email"];
echo json_encode($response);
}
else {
$response["error"] = TRUE;
$response["error_msg"] = "Τα στοιχεία εισόδου είναι λάθος. Παρακαλώ ξαναπροσπάθησε.";
echo json_encode($response);
}
...
POJOclass
public class User {
private int id;
private String error, error_msg, username, email, password;
public String getError(){
return this.error;
}
public String getError_msg(){
return this.error_msg;
}
public int getId(){
return this.id;
}
public String getUsername(){
return this.username;
}
public String getPassword(){
return this.password;
}
public String getEmail(){
return this.email;
}
}
my api 服务接口,其中 validateUser 方法具有用户输入的用户名和密码
API服务
public interface ApiService {
@FormUrlEncoded
@POST("/login/login.php/")
Call<User> validateUser(@Field("username") String username, @Field("password") String password);
}
和我创建 Retrofit 对象的 checkLogin 方法
private void checkLogin(String username, String password){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(AppConfig.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiService apiService = retrofit.create(ApiService.class);
Call<User> call = apiService.validateUser(username, password);
call.enqueue(new Callback<User>() {
@Override
public void onResponse(retrofit.Response<User> response, Retrofit retrofit) {
String email = response.body().getEmail();
Log.d(debugTag, "email: " + email);
}
@Override
public void onFailure(Throwable t) {
}
});
}
当我试图获取用户的电子邮件时发生错误(如果凭据有效)。我收到一个空指针异常...我的 POJO class 有问题吗?
FATAL EXCEPTION: main
11-09 22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem
E/AndroidRuntime: Process: com.votingsystem.tsiro.votingsystem, PID: 21558
11-09 22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem
E/AndroidRuntime: java.lang.NullPointerException
11-09 22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem
E/AndroidRuntime:at com.votingsystem.tsiro.fragments.LoginFragment.onResponse(LoginFragment.java:175)
11-09 22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem
E/AndroidRuntime:at retrofit.ExecutorCallAdapterFactory$ExecutorCallback.run(ExecutorCallAdapterFactory.java:86)
11-09 22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem
E/AndroidRuntime: at
android.os.Handler.handleCallback(Handler.java:733) 11-09 22:51:06.152
21558-21558/com.votingsystem.tsiro.votingsystem E/AndroidRuntime:
at android.os.Handler.dispatchMessage(Handler.java:95) 11-09
22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem
E/AndroidRuntime: at android.os.Looper.loop(Looper.java:136) 11-09
22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem
E/AndroidRuntime: at
android.app.ActivityThread.main(ActivityThread.java:5146) 11-09
22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem
E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native
Method) 11-09 22:51:06.152
21558-21558/com.votingsystem.tsiro.votingsystem E/AndroidRuntime:
at java.lang.reflect.Method.invoke(Method.java:515) 11-09 22:51:06.152
21558-21558/com.votingsystem.tsiro.votingsystem E/AndroidRuntime:
at
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
11-09 22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem
E/AndroidRuntime: at
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566) 11-09
22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem
E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
使用最新版本的改造,即 2.0.0,它允许完整的 url 支持并从此 link
创建您的 pojo
在深入研究 Retrofit 2.0.0 文档后,我终于设法解决了这个问题。根据本指南 https://futurestud.io/blog/retrofit-2-upgrade-guide-from-1-9/,HttpUrl.resolve() 方法创建的链接类似于 .之后,我从部分 url @POST("/login/login.php/") 中删除了前导 / ,它覆盖了我的 BASE_URL 和我将它添加到我的 BASE_URL 并且一切正常。
我正在使用改造库来获取检查登录凭据我的 php 包含响应的文件如下 login.php
...
if ($user["invalid credentials"] != "true"){
$response["error"] = FALSE;
$response["id"] = $user["credentials"]["admin_id"];
$response["username"] = $user["credentials"]["username"];
$response["password"] = $user["credentials"]["password"];
$response["email"] = $user["credentials"]["email"];
echo json_encode($response);
}
else {
$response["error"] = TRUE;
$response["error_msg"] = "Τα στοιχεία εισόδου είναι λάθος. Παρακαλώ ξαναπροσπάθησε.";
echo json_encode($response);
}
...
POJOclass
public class User {
private int id;
private String error, error_msg, username, email, password;
public String getError(){
return this.error;
}
public String getError_msg(){
return this.error_msg;
}
public int getId(){
return this.id;
}
public String getUsername(){
return this.username;
}
public String getPassword(){
return this.password;
}
public String getEmail(){
return this.email;
}
}
my api 服务接口,其中 validateUser 方法具有用户输入的用户名和密码 API服务
public interface ApiService {
@FormUrlEncoded
@POST("/login/login.php/")
Call<User> validateUser(@Field("username") String username, @Field("password") String password);
}
和我创建 Retrofit 对象的 checkLogin 方法
private void checkLogin(String username, String password){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(AppConfig.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiService apiService = retrofit.create(ApiService.class);
Call<User> call = apiService.validateUser(username, password);
call.enqueue(new Callback<User>() {
@Override
public void onResponse(retrofit.Response<User> response, Retrofit retrofit) {
String email = response.body().getEmail();
Log.d(debugTag, "email: " + email);
}
@Override
public void onFailure(Throwable t) {
}
});
}
当我试图获取用户的电子邮件时发生错误(如果凭据有效)。我收到一个空指针异常...我的 POJO class 有问题吗?
FATAL EXCEPTION: main 11-09 22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem
E/AndroidRuntime: Process: com.votingsystem.tsiro.votingsystem, PID: 21558 11-09 22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem
E/AndroidRuntime: java.lang.NullPointerException 11-09 22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem
E/AndroidRuntime:at com.votingsystem.tsiro.fragments.LoginFragment.onResponse(LoginFragment.java:175) 11-09 22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem
E/AndroidRuntime:at retrofit.ExecutorCallAdapterFactory$ExecutorCallback.run(ExecutorCallAdapterFactory.java:86) 11-09 22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:733) 11-09 22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem E/AndroidRuntime:
at android.os.Handler.dispatchMessage(Handler.java:95) 11-09 22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem E/AndroidRuntime: at android.os.Looper.loop(Looper.java:136) 11-09 22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5146) 11-09 22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method) 11-09 22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem E/AndroidRuntime:
at java.lang.reflect.Method.invoke(Method.java:515) 11-09 22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem E/AndroidRuntime:
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732) 11-09 22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566) 11-09 22:51:06.152 21558-21558/com.votingsystem.tsiro.votingsystem E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
使用最新版本的改造,即 2.0.0,它允许完整的 url 支持并从此 link
创建您的 pojo在深入研究 Retrofit 2.0.0 文档后,我终于设法解决了这个问题。根据本指南 https://futurestud.io/blog/retrofit-2-upgrade-guide-from-1-9/,HttpUrl.resolve() 方法创建的链接类似于 .之后,我从部分 url @POST("/login/login.php/") 中删除了前导 / ,它覆盖了我的 BASE_URL 和我将它添加到我的 BASE_URL 并且一切正常。