Vorrei estrarre la lista di utenti attraverso chiamate rest, per conoscere le coordinate di ogni utente o altre info, in questo caso come da esempio voglio solo stampare due campi come UserId e UserName.
Il modello user in node.js:
const userSchema = new mongoose.Schema({
userId: {type: String, required: true},
userAlias: {type: String, required: true, trim:true},
userTokens:[{
token:{
type:String
}
}],
userLongitude: Float,
userLatitude: Float,
userEventLongitude: Float,
userEventLatitude: Float,
userEmail: { type: String, required: true, unique:true,trim:true,
validate(value){
if(!validator.isEmail(value)){
throw new Error('Email is invalid!')
}
}},
userPassword: { type: String, required: true, minlength:7,trim:true,
validate(value){
if(validator.isEmpty(value)){
throw new Error('Please enter your password!')
}else if(validator.equals(value.toLowerCase(),"password")){
throw new Error('Password is invalid!')
}else if(validator.contains(value.toLowerCase(), "password")){
throw new Error('Password should not contain password!')
}
}}
});
In android invece oltre alla classe Users:
public class User{
@SerializedName("_id")
private String _id;
@SerializedName("userId")
private String userId;
@SerializedName("userAlias")
private String userAlias;
@SerializedName("userEmail")
private String userEmail;
@SerializedName("userPassword")
private String userPassword;
@SerializedName("userEventLongitude")
private Float userEventLongitude;
@SerializedName("userEventLatitude")
private Float userEventLatitude;
@SerializedName("userLongitude")
private Float userLongitude;
@SerializedName("userLatitude")
private Float userLatitude;
public User(String _id, String userId, String userEmail, String userPassword, String userAlias, Float userLongitude, Float userLatitude, Float userEventLongitude, Float userEventLatitude) {
this._id = _id;
this.userId = userId;
this.userEmail = userEmail;
this.userPassword = userPassword;
this.userAlias = userAlias;
this.userLongitude = userLongitude;
this.userLatitude = userLatitude;
this.userEventLongitude = userEventLongitude;
this.userEventLatitude = userEventLatitude;
}
...
naturalmente con i suoi getter e setter.
Vedendo online ho sfruttato Retrofit.
public interface RetrofitInterface {
@GET("/users")
Call<List<User>> getListUser();
}
public class NetworkUtil {
public static RetrofitInterface getRetrofit(){
RxJavaCallAdapterFactory rxAdapter = RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io());
return new Retrofit.Builder()
.baseUrl(Constant.BASE_URL)
.addCallAdapterFactory(rxAdapter)
.addConverterFactory(GsonConverterFactory.create())
.build().create(RetrofitInterface.class);
}
mentre nel MAIN:
Call<List<User>> call=NetworkUtil.getRetrofit().getListUser();
Log.d("SafeDrive","ECCOMI");
call.enqueue(new Callback<List<User>>(){
@Override
public void onResponse(Call<List<User>> call, Response<List<User>> response) {
List<User> userlist=response.body();
if(userlist.isEmpty()) Log.d("SafeDrive","VUOTO");
else Log.d("SafeDrive","NON VUOTO");
for(User user:userlist){
Log.d("SafeDrive"," ECCOMI: "+user.getUserId()+"---"+user.getUserAlias()+"\n");
}
}
@Override
public void onFailure(Call<List<User>> call, Throwable t) {
}
});
come mai passa sul primo Log e non sui successivi? come posso vedere se una Call non è nulla?
EDIT: aggiungendo un Toast.makeText in onFailure ho notato che il enqueue fallisce.