我和我的团队正在开发一个聊天应用程序:一个 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/