反序列化 Azure Functions 中的 DeepObject 查询字符串键 / Javascript
Deserialize DeepObject Querystring Keys in Azure Functions / Javascript
我们正在使用 Azure Functions 构建一个 API,规范要求在 GET 请求的查询字符串中引用 DeepObject。因此,结构看起来像 https://example.com/api/persons?name[first]=Todd
。期望的是 一些 的查询键 可能 是 DeepObject 引用,其他的将是扁平的。
显然 Express 可以处理这种模式,但 Azure Functions 使用 ASP.NET 路由器。期望上面的引用 应该 反序列化为 req.params: { name: { first: "Todd" } }
。但是,输出看起来像 req.params: { "name[first]": "Todd" }
.
我真的很想不必 regex/search 每个键,所以有人知道是否:
- ASP.NET里有个config/flag支持这个结构?
- Javascript 中有一个很好的模式可以以某种功能性的——或者至少是非特殊的——方式反序列化它?
注意:任何建议使用eval()
方法的人都不会被选中。但是对于演奏,您会带回家带有 90 年代参考的评论,因为那是过去十年,该方法的使用被认为是可以接受的。 :stuck_out_tongue_winking_eye:
对于这个问题,我认为我们不能改变一些配置来支持这种结构。我们能做的就是自己在代码中实现。
这是我的函数代码:
module.exports = async function (context, req) {
console.log("======query url is:" + req.url);
const result = queryStringToJSON(req.url);
console.log(result);
context.res = {
body: "success"
};
}
function queryStringToJSON(queryUrl) {
if(queryUrl.indexOf('?') > -1){
var queryString = queryUrl.split('?')[1];
}
var pairs = queryString.split('&');
var result = {};
pairs.forEach(function(pair) {
if (pair.indexOf('[') > -1) {
var nameObj = {};
var firstObj = {};
var nameStr = pair.substring(0, pair.indexOf('['));
var firstStr = pair.substring(pair.indexOf('[')+1, pair.indexOf(']'));
firstObj[firstStr] = pair.split('=')[1];
nameObj[nameStr] = firstObj;
Object.assign(result, nameObj);
}else {
pair = pair.split('=');
result[pair[0]] = decodeURIComponent(pair[1] || '');
}
});
return result;
}
启动功能项目,我用http://localhost:7071/api/HttpTrigger1?name[first]=Todd&email=test@mail.com
请求。结果显示:
经过大量搜索,我无法找到在 ASP.NET 路由器中本地实现此功能的任何方法。尽管有很多关于如何在 ASP.NET 控制器函数中直接反序列化此结构的建议,但我在 Javascript.
中工作
有用的是 qs library,在 NPM 中可用,它支持与此查询字符串结构相关的许多细微差别。
const { query } = req;
// => { "name[first]": "Todd" };
const deserializedQuery = qs.parse(query);
// => { name: { first: "Todd" }
对我同样有帮助的是,我需要一种方法以相同的格式重组我的出站查询字符串。 Qs 与 Axios 中的 paramsSerializer
属性一起工作。
const params = { name: { first: "Todd" };
const paramsSerializer = (params) => { return Qs.stringify(params); };
const reqOptions = { params, paramsSerializer };
axios.get("https://example.com/api/persons", reqOptions);
// => GET https://example.com/api/persons?name[first]=Todd
感谢 @hury-shen 提供完全可行的解决方案。这不是我正在寻找的交钥匙解决方案。
我们正在使用 Azure Functions 构建一个 API,规范要求在 GET 请求的查询字符串中引用 DeepObject。因此,结构看起来像 https://example.com/api/persons?name[first]=Todd
。期望的是 一些 的查询键 可能 是 DeepObject 引用,其他的将是扁平的。
显然 Express 可以处理这种模式,但 Azure Functions 使用 ASP.NET 路由器。期望上面的引用 应该 反序列化为 req.params: { name: { first: "Todd" } }
。但是,输出看起来像 req.params: { "name[first]": "Todd" }
.
我真的很想不必 regex/search 每个键,所以有人知道是否:
- ASP.NET里有个config/flag支持这个结构?
- Javascript 中有一个很好的模式可以以某种功能性的——或者至少是非特殊的——方式反序列化它?
注意:任何建议使用eval()
方法的人都不会被选中。但是对于演奏,您会带回家带有 90 年代参考的评论,因为那是过去十年,该方法的使用被认为是可以接受的。 :stuck_out_tongue_winking_eye:
对于这个问题,我认为我们不能改变一些配置来支持这种结构。我们能做的就是自己在代码中实现。
这是我的函数代码:
module.exports = async function (context, req) {
console.log("======query url is:" + req.url);
const result = queryStringToJSON(req.url);
console.log(result);
context.res = {
body: "success"
};
}
function queryStringToJSON(queryUrl) {
if(queryUrl.indexOf('?') > -1){
var queryString = queryUrl.split('?')[1];
}
var pairs = queryString.split('&');
var result = {};
pairs.forEach(function(pair) {
if (pair.indexOf('[') > -1) {
var nameObj = {};
var firstObj = {};
var nameStr = pair.substring(0, pair.indexOf('['));
var firstStr = pair.substring(pair.indexOf('[')+1, pair.indexOf(']'));
firstObj[firstStr] = pair.split('=')[1];
nameObj[nameStr] = firstObj;
Object.assign(result, nameObj);
}else {
pair = pair.split('=');
result[pair[0]] = decodeURIComponent(pair[1] || '');
}
});
return result;
}
启动功能项目,我用http://localhost:7071/api/HttpTrigger1?name[first]=Todd&email=test@mail.com
请求。结果显示:
经过大量搜索,我无法找到在 ASP.NET 路由器中本地实现此功能的任何方法。尽管有很多关于如何在 ASP.NET 控制器函数中直接反序列化此结构的建议,但我在 Javascript.
中工作有用的是 qs library,在 NPM 中可用,它支持与此查询字符串结构相关的许多细微差别。
const { query } = req;
// => { "name[first]": "Todd" };
const deserializedQuery = qs.parse(query);
// => { name: { first: "Todd" }
对我同样有帮助的是,我需要一种方法以相同的格式重组我的出站查询字符串。 Qs 与 Axios 中的 paramsSerializer
属性一起工作。
const params = { name: { first: "Todd" };
const paramsSerializer = (params) => { return Qs.stringify(params); };
const reqOptions = { params, paramsSerializer };
axios.get("https://example.com/api/persons", reqOptions);
// => GET https://example.com/api/persons?name[first]=Todd
感谢 @hury-shen 提供完全可行的解决方案。这不是我正在寻找的交钥匙解决方案。