android - 从响应中获取单独的 JSON

标签 android json node.js http

我和我的团队正在开发一个聊天应用程序:一个 Android 客户端和一个网络客户端。
最近,我们偶然发现了一个阻塞问题。方法如下:

因此,网络和 Android 客户端(从现在开始我将它们称为“客户端”)与 Node.js 服务器进行通信。

我们实际上正在处理登录/注册部分。这是我们目前所拥有的示例:

安卓客户端

  • MainActivity.java

    Button loginButton = (Button) findViewById(R.id.loginButton);
    loginButton.setOnClickListener(new LoginListener());
    
    private class LoginListener implements View.OnClickListener {
    
        @Override
        public void onClick(View v) {
            CustomAsyncTask manageSession = new CustomAsyncTask();
            Map<String, String> params = new HashMap<>();
            params.put("postURL", "/signin");
            params.put("username", mUsername.getText().toString());
            params.put("password", mPassword.getText().toString());
            manageSession.execute(params);
        }
    }
    

简而言之,这段代码的作用是向 /signin 路由发送参数化的 POST 请求。

网络客户端

<form ...>...</form>

<script type="text/javascript">
    $('button').click(function(){
        $.post('/signin',{username : $('#username').val(),password :$('#password').val()});
    })
</script>

服务器端

// signin post
app.post('/signin', function (req, res) {
    connection.query('SELECT * FROM User WHERE ((username = "' + req.body.username + '" OR email = "' + req.body.username + '") AND password = "' + req.body.password + '")', function (err, rows) {
        if (err) throw err;
        // If the user entered a valid username or email, then check for the password
        if (rows.length > 0 && rows[0].password == rows[0].password) {
            res.render('index', { status: "SUCCESS", username: req.body.username })
        } else {
            // Valid username or email, but invalid password
            res.render('index', { status: "FAILURE", username: req.body.username })
        }
    });
})

问题

从上面的代码 fragment 可以看出,客户端向/signin 路由发送POST 请求,但是:

  • Android 客户端需要纯 JSON 作为响应
  • 网络客户端期望整个页面作为响应(index.ejs)

res.render() 解决了client 2的问题,res.end({json}) 解决了的问题客户 1

有没有一种方法可以将响应分开,以便每个客户端都能得到它想要的东西?
解决这个问题的最佳方法是什么?

最佳答案

您可以添加一个额外的变量来获取它是来自网络还是来自 android,然后根据需要进行操作。 例如-

app.post('/signin', function (req, res) {
    connection.query('SELECT * FROM User WHERE ((username = "' + req.body.username + '" OR email = "' + req.body.username + '") AND password = "' + req.body.password + '")', function (err, rows) {
        if (err) throw err;
        // If the user entered a valid username or email, then check for the password
        if (rows.length > 0 && rows[0].password == rows[0].password) {
            if(req.body.device_type == "web"){
                res.render('index', { status: "SUCCESS", username: req.body.username })
            }
            else{
                res.end({ status: "SUCCESS", username: req.body.username })
            }
        } else {
            // Valid username or email, but invalid password
            if(req.body.device_type == "web"){
                res.render('index', { status: "FAILURE", username: req.body.username })
            }
            else{
                res.end({ status: "FAILURE", username: req.body.username })
            }
        }
    });
})

在安卓中:-

params.put("postURL", "/signin");
params.put("username", mUsername.getText().toString());
params.put("password", mPassword.getText().toString());
params.put("device_type", "android");
manageSession.execute(params);

在网络中:-

$.post('/signin',{username : $('#username').val(),password :$('#password').val(),device_type:'web'});

如果还有问题,请告诉我。

关于android - 从响应中获取单独的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34333663/

相关文章:

android - 我需要更新什么才能获得最新的 recyclerview 方法?

node.js - 使用 Google Cloud Storage 库时出现问题

javascript - 使用 AJAX 或 Socket.IO 在我的 Node.Js 应用程序后台提交表单,获取结果,更新页面

node.js - 有没有办法让 npm install (命令)在代理后面工作?

java - Android,不生成ActionBar

java - Android - 如何从 Fragment 访问父 Activity 中的 getter 方法

android - fragment 事务 : ReplaceFragment

java - 从 Java 启动 HTML/CSS/Javascript 文件

Javascript提交一个括号而不是json字符串化

javascript - 在 Javascript 中访问嵌套在另一个对象中的对象的属性