0

node.js アプリケーション用のネイティブ Android アプリ クライアントと Web アプリ クライアントを作成しました。Android アプリ クライアントは json 応答のみを受信し、Web アプリ クライアントは html 応答を受信します。そのため、node.js サーバーが要求を Android アプリと Web アプリから区別することが重要です。http ヘッダーAcceptを使用して、さまざまな要求を区別しようとしました。Accept ヘッダーが application/json の場合、サーバーはリクエストが Android からのものであると判断でき、Accept ヘッダーが html/text の場合、サーバーはリクエストが Web アプリからのものであると判断できます

これは、フォームを使用してリクエストを送信する 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

AcceptAndroid アプリケーションから送信しているヘッダーを見てください。

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

あなたは を持って*/*います。これは、 を含むすべてを受け入れていることを意味しますtext/html

ヘッダーを変更するとうまくいきます:

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