使用 Retrofit POST 请求获取对象数组

时间:2021-01-08 09:56:17

标签: android json express retrofit

我在获取对象内的数组时遇到问题。我正在使用带有 NodeJS/Express 后端的 Android Studio 和 Java。我正在尝试取回用户角色,以便我可以将用户重定向到正确的片段。

这是我的登录模型

package com.example.vmsandroid;

import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Login {

    @SerializedName("user")
    @Expose
    private List<User> user = null;

    public List<User> getUser() {
        return user;
    }

    public void setUser(List<User> user) {
        this.user = user;
    }

}

这是我的用户模型

package com.example.vmsandroid;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class User {

    @SerializedName("role")
    @Expose
    private String role;
    @SerializedName("username")
    @Expose
    private String username;

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

}

这是我的改造实例:


        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(okHttpClient)
                .build();

        retrofitInterface = retrofit.create(RetrofitInterface.class);

这是我的 API 调用

    @POST("/app/login")
    Call<Login> executeLogin(@Body HashMap<String, String> map);

这是我的 ExpressJS POST 请求

accountRoutes.post('/app/login', function(req,res){
    var matched_users_promise = models.user.findAll({
        where: Sequelize.and(
            {username: req.body.username},
        )
    });
    matched_users_promise.then(function(users){
        if(users.length > 0){
            let user = users[0];
            let passwordHash = user.password;
            const userArray = [];
            if(bcrypt.compareSync(req.body.password, passwordHash)){
                client.select("role","username").from("users").where( { username: req.body.username }).then(data =>{
                    res.status(200).send(JSON.stringify({user:data}));
                    console.log(data);
                })
                // console.log(rolequery.role);
                // res.status(200).send(JSON.stringify(objToSend))
            }
            else{
                res.status(404).send();
            }
        }
        else{
           res.status(404).send();
            
        }
    });
});

我的 onResponse 和 onFailure

 private void handleLoginDialog() {

        View view = getLayoutInflater().inflate(R.layout.login, null);

        AlertDialog.Builder builder = new AlertDialog.Builder(this);

        builder.setView(view).show();

        Button loginBtn = view.findViewById(R.id.login);
        EditText usernameedit = view.findViewById(R.id.username);
        EditText passwordedit = view.findViewById(R.id.password);

        loginBtn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                HashMap<String, String> map = new HashMap<>();

                map.put("username", usernameedit.getText().toString());
                map.put("password", passwordedit.getText().toString());

                Call<Login> call = retrofitInterface.executeLogin(map);

                call.enqueue(new Callback<Login>() {
                    @Override
                    public void onResponse(Call<Login> call, Response<Login> response) {
                            if (response.code() == 200){
//                                startActivity(new Intent(getApplicationContext(),MainMenu.class));

//                                AlertDialog.Builder builder1 = new AlertDialog.Builder(MainActivity.this);
//                                builder1.setTitle(loginresult.getRole());
//                                builder1.setMessage(loginresult.getUsername());
//                                builder1.show();
                                Toast.makeText(MainActivity.this, "role"+ response.body().getUser(), Toast.LENGTH_SHORT).show();
                            }
                            if (response.code() ==404){
                                Toast.makeText(MainActivity.this, "Invalid Username or Password", Toast.LENGTH_SHORT).show();
                            }
                 }

                    @Override
                    public void onFailure(Call<Login> call, Throwable t) {
                        Toast.makeText(MainActivity.this, "error" + t.getMessage(), Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });
    }

登录后,这是我从 HTTPinterceptor 获得的 JSON 响应。 {"user":[{"role":"Tenant", "username":"edvin"}]}

出于某种原因,这就是 Toast 发回的内容。 role:com.example.vmsandroid.User@edbe883 “edbe833”总是不同的和随机的。

非常感谢帮助,已经连续研究了 2 天,但仍然找不到解决方案。如果还有什么需要我提供的,请告诉我

2 个答案:

答案 0 :(得分:1)

哈哈。在发布此内容 5 分钟后,我找到了解决方案。对于像我一样也有问题的人,这里是解决方案。

response.body().getUser() 更改为 response.body().getUser().get(0).getRole()

答案 1 :(得分:0)

对不起我的英语

请重写数据类User中的toString方法

因为在 toast 中使用了 '+',所以调用 toString 转换为 String obj

所以它调用了Object类的toString方法

就这些