使用 Azure Functions,您需要做什么才能从用 node.js 编写的函数返回正文中的 JSON 对象?我可以轻松地返回一个字符串,但是当我尝试返回一个如下所示的 json 对象时,我似乎没有返回任何内容。
context.res = {
body: jsonData,
contentType: 'application/json'
};
使用 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();
};
它将返回一个application/json
响应,因为它嗅到它是有效的 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);
我想再补充一点。除了制作 body: 一个 JSON 对象之外,请求还应该包含适当的标头,告诉服务器我们感兴趣的内容类型。我可以看到,当刚刚通过浏览器使用 URL 调用相同的 Azure 函数时,会给出 XML 响应,但是从脚本调用时或像 Postman 这样的工具,它提供 JSON。
我觉得答案已经给出,但没有明确提出,所以我想我也会回答,以防万一它会帮助后面的任何人。我也创建了一个绝对返回 Javascript 对象的函数,但是如果我将 URL 复制并粘贴到 Azure 函数 UI 中,然后在 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)
};