Chiamata Rest

di il
1 risposte

Chiamata Rest

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.

1 Risposte

  • Re: Chiamata Rest

    Mettendo dei Log in onFailure ho notato che non si connetteva, naturalmente non ci avevo pensato bene in quanto l'emulatore non vedeva l'indirizzo localhost.
    In futuro: se usate l'emulatore di android studio l'indirizzo è il seguente: http://10.0.2.2:XXX(porta). Mentre se fate girare l'app sul device fisico, dovete inserire l'indirizzo IP del pc, naturalmente il telefono deve essere connesso alla stessa rete.
Devi accedere o registrarti per scrivere nel forum
1 risposte