【问题标题】:Why does string not pass correctly to server when there is a '#' in my variable?当我的变量中有“#”时,为什么字符串不能正确传递给服务器?
【发布时间】:2019-11-15 10:38:42
【问题描述】:

我正在尝试对一个对象进行字符串化,但是当对象中有一个“#”时,我的 url 没有正确返回。

我已经输出了JSON.stringify($scope.parameter); 的值,它是正确的,但是 url 不是。

$scope.parameter = '#' + parameter;

var url = $scope.url + '&functions=' + JSON.stringify($scope.parameter);

我希望它是 {"1":"i001::#11 object"}

但它实际上是 {"1":"i001::

【问题讨论】:

  • 在字符串化之前显示$scope.parameter
  • DaCuI'm rse 期望值是'$scope.parameter'

标签: javascript stringify


【解决方案1】:

因为您没有正确编码它,所以它被解释为片段标识符(# 引入了片段标识符)。

您必须对放入 URI 中的内容进行 URI 编码:

var url = $scope.url + '&functions=' + encodeURIComponent(JSON.stringify($scope.parameter));
// ------------------------------------^

从技术上讲,您还必须在上面对functions 进行URI 编码,但是由于functions 的URI 编码版本是,呃,functions,所以我没有在上面打扰。但如果它不一定安全,那么:

var url = $scope.url + '&' + encodeURIComponent(key) + '=' + encodeURIComponent(JSON.stringify($scope.parameter));

如果您在 name=value 对中使用的名称仅包含数字、字母、下划线和破折号,您可以安全地省略它们的 URI 编码,就像我在上面的第一个示例中所做的那样。 (还有一些其他字符也是允许的,但如果您开始使用这些字符,为了安全起见,只需按照第二个示例中的方式进行编码。)

【讨论】:

  • @DaCurse - 如果服务器在 functions 查询参数的值中期望 JSON,则不是。
  • Stringify 是用来在对象上转换为 JSON 的,他将 # 连接到他的对象的开头(据说),这就是我感到困惑的原因
  • @DaCurse - # 只是字符串中的一个字符,它是对象的 "1" 属性的值。据我所知,OP 没有在对象的开头放置 #。只是该对象在一个字符串中有一个#,它是它的一个属性的值。例如:jsfiddle.net/tjcrowder/1oyvwj5x
猜你喜欢
  • 2018-12-22
  • 2019-03-04
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 2021-09-29
  • 1970-01-01
相关资源
最近更新 更多