【问题标题】:Form action vs AJAX request - sending JSON表单操作与 AJAX 请求 - 发送 JSON
【发布时间】:2016-07-01 12:19:23
【问题描述】:

在一个相当大的 PHP/Drupal 网站上(这不是 Drupal 问题),我们的任务是允许一个深层链接进入一个页面,其中大量数据必须由调用站点提供。

跨域不会成为问题,因为我们可以控制两端并且可以根据需要进行调整。

所以我们想要的是在原始服务器 [A] 上单击提交表单会将 POST 数据发送到接收服务器 [B]。这很简单。

之所以如此复杂,是因为还必须发送大量非用户数据(不管它为何或来自何处)。所以 (i) 有额外的数据要添加到 POST 负载中,并且 (ii) 原始服务器 [A] 是 node.js,他们想要发送 JSON 编码的数据而不是使用 form-urlencoded。

他们(JS 人)想一口气完成。用户单击 [A] 上的表单,他们构建有效负载,POST 到深度链接 URL,浏览器显示来自 [B] 的新页面。

我可以在 PHP 端处理它,但我无法从概念上理解它。我觉得不可能。

据我了解,表单操作 URL 是关键。正是这个重定向浏览器,在 URL 或正文中发送表单 urlencoded 数据。 (不能像我们所知的那样使用 JSON。)

但在我看来,如果他们做任何事情来中断 [A] 上的表单处理,浏览器将不会被重定向到 [B],它只会变成 AJAX 调用。

所以问题是:是否可以修改表单的有效负载并仍然获得相同的行为,将浏览器重定向到新页面?

(如果这是不可能的,解决方案相对简单,一个 AJAX 调用来设置所有内容,返回一个 URL,将浏览器重定向到提供的 URL。)

【问题讨论】:

  • 你能把 JSON 数据放在表单的隐藏输入中吗?
  • 我已将其作为测试的一部分进行,它运行良好,但这不是计划中的数据合同的一部分。我想探索所有选项,因为我什至不知道是否可以完成。因此,最后的实际问题。我有替代解决方案,但可以按照我们想要的方式完成吗?
  • 你认为你会在哪里修改有效载荷 from?在我看来,您故意排除了简单的解决方案。
  • 我不是在寻求解决方案,我是在问是否有人知道我的问题的答案。
  • @nnnnnn — 如果这样做,您最终会在 application/x-www-form-urlencoded 有效负载中嵌入 JSON,而不是 JSON 有效负载。

标签: javascript php json ajax forms


【解决方案1】:

让我了解您的问题:

在服务器 A (nodejs) 上有一个按钮,单击它后,您希望 B 的一些数据(以及许多其他数据)发送到第二个服务器 B,它将显示完全不同的页面

你的 (nodejs) 人想直接从 nodejs 向你发送数据,json 编码

我认为你有两个选择

首先 - 不太好:

nodejs 在服务器 A 上显示表单,附加数据设置为隐藏输入字段(编码方式如何),在指向服务器 B 的 <form> 标记 action 属性中(深层链接),然后服务器 B 获取数据,解码并显示最后一页。

优点: - 简单

缺点: - 您向外部用户公开所有数据和到服务器 B 的链接(数据通过浏览器发送到服务器 B), - 可能有很多数据(并且传输时间很长), - 数据可以被(攻击者)操纵

第二个选项,更好:

是服务器A显示html form,并从该表单接收数据,然后服务器A直接向服务器B发送数据,然后服务器A接收来自服务器B的响应并作为响应发送到发布的表单。

优点: - 安全(您不会公开其他数据并且隐藏了深层网址) - 更快,因为服务器 A 和 B 可以通过 LAN 进行通信,而不是 Internet - 你可以隐藏服务器 B 的存在

缺点: - 如果要将用户切换到服务器 B,处理的复杂性 - 在这种情况下,您需要(例如)将 url 返回到服务器 B 上的页面,因此服务器 A 会将 HTTP Redirect 作为响应发送到该 url。

【讨论】:

  • 我怀疑是什么,但 nodejs 人坚持他们可以做到。
【解决方案2】:

不,不是。

您最接近的方法是使用 Ajax 发出请求,并在响应中包含一个 URL(带有一个令牌来标识您在其中使用 Ajax 发出的请求),您可以将其分配给location.href in XHR 的load 事件。

【讨论】:

  • 这确实是备用计划,您可以从问题下方括号内的注释中看到 :-)
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 2014-10-06
  • 2023-03-18
  • 2015-02-26
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 2019-11-01
相关资源
最近更新 更多