【问题标题】:Get separate JSON from the response从响应中获取单独的 JSON
【发布时间】:2015-12-17 11:38:27
【问题描述】:

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

因此,Web 和 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 })
        }
    });
})

问题

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

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

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

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

【问题讨论】:

  • 发送另一个布尔参数,命名为isWeb,并根据您使用的客户端发送真假值。现在你可以做出两个不同的回应,不是吗?
  • 另一种方式是发送设备类型如android、ios、web等,根据设备类型你可以给出响应
  • 嗯,你可以设置一个接受头参数。像“接受:应用程序/json”。通过 res.headers 在服务器端访问它们,以便您确定要发回的内容。
  • @Clairvoyant 有什么我应该知道的副作用吗?
  • @JörnBuitink 听起来可行。

标签: android json node.js http


【解决方案1】:

您可以添加一个额外的变量来获取它是来自 web 还是 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'});

如果还有问题请告诉我。

【讨论】:

  • 如果这对你有用,那么请接受@Sparta 的答案
猜你喜欢
  • 2022-06-28
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 2017-06-18
  • 1970-01-01
相关资源
最近更新 更多