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') が予期せず機能する理由がわかりません