【问题标题】:Encode string javascript so that it can be transmitted to a server对字符串 javascript 进行编码,以便将其传输到服务器
【发布时间】:2023-03-28 19:36:01
【问题描述】:

我正在尝试将 get 请求中的 json 字符串发送到服务器,这是编码前的样子:

filters={"groupOp":"AND","rules":[{"field":"countrycode","op":"eq","data":"ARG"}]}

当我试图获取这个 json 字符串时,我自然会得到空指针,然后我用谷歌搜索了这个 encodeURIComponent,它部分地编码了这个字符串,如下所示:

filters={"groupOp"%3A"AND"%2C"rules"%3A[{"field"%3A"countrycode"%2C"op"%3A"eq"%2C"data"%3A"ARG"}]}

但这就是它应该如何工作的方式:

filters=%7B%22groupOp%22%3A%22AND%22%2C%22rules%22%3A%5B%7B%22field%22%3A%22countrycode%22%2C%22op%22%3A%22eq%22%2C%22data%22%3A%22ARG%22%7D%5D%7D

如何获得这个完全编码的字符串,以便在服务器端正确读取它?

我使用 get 而不是 post 的原因

我正在将这个过滤器(json)内容发送到服务器端,Web 服务从数据库中获取数据并返回 pdf 文档。

使用 post,我能够发送正确的数据,并且响应成功显示在我的 firebug 控制台中。但我需要返回 pdf doc 以覆盖当前页面或打开新窗口/选项卡并返回该页面。

【问题讨论】:

  • 你到底要寄什么?
  • 也许他在找JSON.stringify
  • @Tomalak Geret'kal @ 服务器端我正在使用spring mvc

标签: javascript json jqgrid


【解决方案1】:

我认为你在这个问题上工作过度了。或者编码太多次。或者其他的东西。 您有一个 JSON 字符串,并且您正在尝试对其进行 JSON 编码。这似乎……没有帮助。

更好的方法可能是生成一个 Javascript 对象,然后 JSON.Stringify that,然后将其作为参数传输。

var thing = {
  groupOp : "AND",
  rules : [
    { field : "countrycode", op : "eq", data : "ARG" },
      ...
  ],
    ...
}; 
var stringrep = JSON.stringify(thing);
// post via jQuery
$.ajax({
  type: 'POST',
  url: url,
  data: stringrep,
  dataType: 'json'
  success: function() { ... },
});

通常,对于传入或传出服务器的 JSON 字符串化消息,您会希望使用 HTTP POST。 HTTP GET 将所有“参数”放在 URL 中;没有消息正文。相反,HTTP POST 允许您将消息正文附加到 HTTP 消息,它可以是“任何东西”。使用这种方法,您不需要对引号和空格进行 url 编码; JSON 消息只是作为 HTTP 消息的消息体传输。

HTTP POST 是应用程序上传图像或传输 XML 文档等的方式。任何复杂的东西都通过 POST 传输。

【讨论】:

  • 我喜欢您的回答,您无需对任何内容进行编码即可发布。但问题是我需要返回 pdf 文档,这就是我使用 get 的原因,所以我用某些数据填充它。所以我返回渲染的 pdf 文档,并发布请求返回成功响应,我可以在 firebug 中看到它。我需要它在新页面中打开或覆盖当前页面。
  • 我不明白;如果您说的是需要得到响应,那么您当然可以从 POST 消息中收到响应,并且响应可能是 PDF 文档。如果你有一堆数据要发送到服务器,那么使用 post 是有意义的,它需要产生响应,无论响应是什么。
  • tnx,我现在明白了,它看起来非常优雅,没有所有这些 get 参数,也不需要对它们进行编码
【解决方案2】:
var filtersParameter = 'filters=' + encodeURI(JSON.stringify(filters));

【讨论】:

  • nop 产生filters="{\"groupOp\":\"AND\",\"rules\":[{\"field\":\"countrycode\",\"op\":\"eq\",\"data\":\"ARG\"}]}"
  • 别忘了encodeURI()。如果我运行它,我会得到:filters=%7B%22groupOp%22:%22AND%22,%22rules%22:%5B%7B%22field%22:%22countrycode%22,%22op%22:%22eq%22,%22data%22:%22ARG%22%7D%5D%7D
  • 你要把它放在 URL 中吗?我想我只是在我的鞋子上吐了。
  • 在这种情况下,POST 比 GET 好得多。
  • 2018 这里.. 我也吐了一身衬衫
【解决方案3】:
var filtersParameter = 'filters=' + atob(JSON.stringify(filters));

注意:atob() 方法使用 base64 算法对数据进行编码。这个编码数据可以很容易地传递到服务器,在那里可以使用相应的解码方法对其进行解码(在python中使用base64.b64decode(encoded_string))。

【讨论】:

    猜你喜欢
    • 2021-11-01
    • 2018-04-19
    • 2016-09-18
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    相关资源
    最近更新 更多