0

我为 node.js 应用程序制作了一个原生 android 应用程序客户端和一个 Web 应用程序客户端。android app客户端只接收json响应,web app客户端接收html响应。所以node.js服务器区分android app和web app的请求很重要。我尝试使用 http 标头Accept来区分不同的请求。如果 Accept header 是 application/json,那么服务器可以判断请求来自 android,如果 Accept header 是 html/text,那么服务器可以判断请求来自 web app

这是使用表单发送请求的 Web 应用程序客户端

                <div class="input">
                    <input id="id_username" type="text"  name="username" maxlength="75" />               
                </div>
                <div class="input">
                    <input type="password"  name="password" id="id_password" />               
                </div>                                 
                   <input type="submit" value="Log in" class="btn btn-green"/>                
            </form>

这是发送http请求的android客户端

HttpPost post = new HttpPost(getURL);
post.setHeader("Accept", "application/json;q=0.9,*/*;q=0.8");

两个客户端都正常,问题出在 node.js 服务器上。

 if(req.accepts('text/html')){
    res.redirect('/login');
    return;
 }
 else if(req.accepts('application/json')){  
    res.json({'msg':'user or password not valid'});
    return;
 }

这个片段的问题是,即使 req.accepted 是 application/json,req.accepts('text/html') 仍然等于 true。

我不知道为什么 req.accepts('text/html') 会意外运行

4

1 回答 1

1

查看Accept您从 android 应用程序发送的标头:

post.setHeader("Accept", "application/json;q=0.9,*/*;q=0.8");

你有*/*,这意味着你接受一切,包括text/html.

如果您更改标题,它将正常工作:

post.setHeader("Accept", "application/json");
于 2013-07-20T14:35:21.547 回答