Android Loopj 的异步 Json 对象响应转换为 Objectid 失败

Android Loopj's Async JsonObject reponse is cast to Objectid failed

我在 Android & Restful API 编程方面相对较新,所以我可能会犯一些愚蠢的错误。但是我从我的回复 JsonObject 中面临这个问题:

Cast to ObjectId failed for value \"login\" at path \"_id\" for model \"User\"","name":"CastError","stringValue":"\"login\"","kind":"ObjectId","value":"login","path":"_id"}

我已经在 Postman 上测试了我的 Rest API,一切正常 return。 Restful API 是用Node.js 和 Express 写的。

其余 API 假设 return 状态、用户 ID 和消息,让应用知道用户是否使用正确的用户名和密码登录。登录工作正常,它 return 给我一个 200,它允许应用程序登录并使用会话保持登录状态。但是,我无法从响应 JsonObject 中获取任何信息来获取下一步显示用户信息的用户标识。

(目标 Android API 23)

代码:

Restful.Java

public class RestClient {

    private static final String BASE_URL = "http://10.0.2.2:8000/api/";
    private static AsyncHttpClient client = new AsyncHttpClient();

    public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler){
        client.get(getAbsoluteUrl(url), params, responseHandler);
    }

    public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler){
        client.post(getAbsoluteUrl(url), params, responseHandler);
    }

    private static String getAbsoluteUrl(String relativeUrl){
        Log.d("URL: ", BASE_URL+relativeUrl);
        return BASE_URL + relativeUrl;
    }
}

LoginActivity.Java(仅登录部分)

public void checkLoginDB(final RequestParams params, final String username){
        prgDialog.show();     

        RestClient.post("user/login", params, new JsonHttpResponseHandler(){
            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
                Log.d("StatusCode: ", "Code "+ statusCode);
                try {
                    if (statusCode == 200) {
                        Toast.makeText(getApplicationContext(), "Logged In!", Toast.LENGTH_LONG).show();
                        session.createLoginSession(username);
                        Log.d("Log: ", "what " + response);
                        navigatetoHomeActivity();
                    }
                } catch (Exception e){
                    e.printStackTrace();
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
                Log.d("StatusCode: ", "Code "+ statusCode);
                prgDialog.hide();
                Toast.makeText(getApplicationContext(), "Failed!", Toast.LENGTH_LONG).show();
            }
        });
    }

RestfulAPI的Server.js

  router.post('/user/login', function(req, res){
    var username = req.body.username;
    var password = req.body.password;
    if(username.length > 0 && password.length > 3){
      User.findOne({username: username, password: password}, function(err, user){
        if(err)
          res.json({statusCode: 0, message: "login error: " + err});
        if(!user)
          res.json({statusCode: 0, message: "Not Found"});

        res.json({statusCode: 200, userid: user._id, message: "Login Sucessful"});
      })
    } else {
      res.json({statusCode: 0, message: "Invalid Fields"});
    }
  });

  app.use('/api', router)

User.js(定义的架构)

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var UserSchema = new Schema({
  username: String,
  password: String,
  firstname: String,
  lastname: String,
  agentID: Number,
  email: String,
  phone: Number
});

module.exports = mongoose.model('User', UserSchema);

每当您想登录用户并希望 return 中的用户详细信息时,请使用 post() 方法。 在您的代码中,第二种方法不是 post,因此将 client.get() 更改为 client.post()

像这样public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler){ client.post(getAbsoluteUrl(url), params, responseHandler); }