Azure Functionsで、node.jsに記述された関数から本文のJSONオブジェクトを返すために何をする必要がありますか?文字列は簡単に返すことができますが、以下に示すようにjsonオブジェクトを返そうとすると、何も返されないように見えます。
context.res = {
body: jsonData,
contentType: 'application/json'
};
私の最近のテスト(2017年3月)に基づいています。 jsonを元に戻すには、応答ヘッダーにコンテンツタイプを明示的に追加する必要があります。そうしないと、データがブラウザーでXMLとして表示されます。
"コンテンツタイプ": "アプリケーション/ json"
res = {
status: 200, /* Defaults to 200 */
body: {message: "Hello " + (req.query.name || req.body.name)},
headers: {
'Content-Type': 'application/json'
}
};
以下の完全なサンプル:
module.exports = function (context, req) {
context.log('JavaScript HTTP trigger function processed a request.');
context.log(context);
if (req.query.name || (req.body && req.body.name)) {
res = {
// status: 200, /* Defaults to 200 */
body: {message: "Hello " + (req.query.name || req.body.name)},
headers: {
'Content-Type': 'application/json'
}
};
}
else {
res = {
status: 400,
body: "Please pass a name on the query string or in the request body"
};
}
context.done(null, res);
};
データがJSオブジェクトの場合、これは機能するはずです。
module.exports = function(context, req) {
context.res = {
body: { name: "Azure Functions" }
};
context.done();
};
これにより、application/json
応答が返されます。
代わりに、json stringにデータがある場合、次のようにすることができます。
module.exports = function(context, req) {
context.res = {
body: '{ "name": "Azure Functions" }'
};
context.done();
};
有効なjsonであることをスニッフィングするため、application/json
応答を返します。
module.exports = function (context, req) {
context.log('JavaScript HTTP trigger function processed a request.');
if (req.query.name || (req.body && req.body.name)) {
context.res = {
// status: 200, /* Defaults to 200 */
body: {"data":"Hello"},
headers: {
'Content-Type': 'application/json'
}
};
}
else {
// res = {
// status: 400,
// body: "Please pass a name on the query string or in the request body"
// };
}
context.done(null,res);
もう一点申し上げたいと思います。本文の作成とは別に、JSONオブジェクトには、リクエストに適切なヘッダーを含めて、サーバーにどの content type に興味があるかを伝える必要があります。URLを使用してブラウザー経由で呼び出すと、同じAzure関数がXML応答ですが、スクリプトまたはPostmanなどのツールから呼び出すと、JSONが返されます。
答えは出たような気がしますが、はっきりとは出ていないので、誰かが後ろに来るのを助けてくれるので、答えてもいいと思いました。私もJavascriptオブジェクトを確実に返す関数を作成しましたが、Azure関数UIにURLをコピーして貼り付け、Chromeで新しいタブを開いて出力を表示しようとすると、エラーが発生したことを伝えるXMLドキュメントを実際に取得します(Javascriptの多くの文字がXMLを破壊していたため、エラーが発生したことは当然のことです)。したがって、他の人が述べたように、キーはリクエストに適切なヘッダーを送信しています。URLをブラウザーにコピーして貼り付けると、ブラウザーは次のようなリクエストヘッダーを送信します。
text/html、application/xhtml + xml、application/xml; q = 0.9、image/webp、/; q = 0.8
これが発生すると、このリンクで説明されているようにXMLが返されます。 https://github.com/strongloop/strong-remoting/issues/118
この問題を回避し、JSONリクエストでデータがどのように表示されるかを確認するには、Postmanのようなユーティリティを使用します。 https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl = en
Accept: application/json
または、CURLコマンドを使用して、適切なAcceptヘッダーを渡します。
上のスクリーンショットでわかるように、適切なヘッダーを指定すると、期待どおりのJSON応答が返されます。
JSON.stringify()を使用して、jsオブジェクトから有効なjson文字列を作成することもできます。
jsonData = { value: "test" }:
context.res = {
body: JSON.stringify(jsonData)
};