【发布时间】: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 听起来可行。