post api 调用和使用 post 方法提交表单有什么区别?

What is the difference between post api call and form submission with post method?

我想调用支付网关,因为该支付网关是使用表单提交调用的,方法为 post,我可以使用 post API 调用来调用同一个网关吗节点 js HTTP 模块,我很困惑,我不能使用 post API 调用网关,因为它不会重定向到新页面,并且表单有 methodaction可以通过 post 调用重定向到新页面吗?

表单数据一般都是这样发送的

address=Whosebug&poster=Ashkay

而 JSON 格式的普通 post 会像

{
   "address": "Whosebug",
   "poster": "Ashkay"
}

您可以在 NodeJS 中模仿表单 POST 请求,例如:

const request = require("request");

request({
  uri: "http://www.test.com/payment/gateway.php",
  method: "POST",
  form: {
    address: "Whosebug",
    name: "Ashkay"
  }
}, function(error, response, body) {
  console.log(body);
});

从浏览器提交表单有多种方式:

  1. HTML 表单,提交按钮,用户按下提交按钮,不涉及 Javascript。
  2. HTML 表单中的页面,Javascript 获取表单的 DOM 元素并调用表单 object.[=44 上的 .submit() 方法=]
  3. Ajax 使用带有 POST 方法的 XMLHttpRequest 接口调用并手动发送适当的表单数据。
  4. Ajax 使用 POST 方法获取调用并手动发送适当的表单数据。

使用#1 或#2,浏览器发送表单,浏览器会注意重定向,并会在浏览器中显示表单响应(无论是否重定向)。

对于#3 和#4,表单通过 Javascript 发送,响应返回到您的 Javascript。 #3 不处理重定向。 #4 有一个选项来处理重定向。以下是有关上述每个选项的更多信息。 #3 和 #4 不影响浏览器显示 完全不受影响,除非你编写自己的 Javascript 来处理请求并影响浏览器显示(通过插入内容或将 window.location 设置为新的URL.


以下是关于上述方案的更多信息:

使用 XMLHttpRequest 的程序化 Ajax 调用不会以任何方式处理重定向或来自 Ajax 调用的响应。他们只是 return 对您的 Javascript 的回应。请记住,重定向只是您可以从 Ajax 调用中获得的一种特定类型的响应。这不同于浏览器提交的表单 POST.

使用 fetch() 界面的程序化 Ajax 调用提供了一个选项来自动跟随重定向。请参阅 redirect 选项 here。但是,即使在这种情况下,fetch() 接口所做的只是获取重定向的 URL 的内容。它不会导致浏览器页面发生变化。为此,您必须编写自己的 Javascript 代码来查看 3xx 重定向响应,然后将 window.location 设置为新的重定向 URL。或者,您必须让界面自动跟随重定向,然后对新的重定向内容做一些事情,它将 return 到您的 Javascript.

这些程序化请求不同于让浏览器为您提交表单。在浏览器提交的情况下(不使用 Javascript 提交表单),浏览器会根据从表单响应中 return 编辑的任何内容进行重定向并更新浏览器中的显示。

当您通过 Ajax 提交表单时,浏览器不会自动对服务器响应执行任何操作。该响应返回到您的 Javascript 并且您的脚本决定如何处理它。如果你想让你的脚本跟随重定向,那么你必须检查响应,看看它是否是 3xx 状态,从适当的 header 获取新的 URL 并将 window.location 设置为那个新的URL。这将导致浏览器显示重定向页面。但是,您必须自己编写程序或找到一个 Ajax 库,该库提供了一个功能来完成它。一个标准的 Ajax 调用只是 return 表单 POST 响应返回给您的 Javascript - 仅此而已。您的脚本必须处理该响应并决定下一步做什么。

I am confused, that I cannot call gateway using post API cause it won't redirect to new page

可以。您只需要编写自己的 Javascript 来处理程序化 API 调用的响应,如果它是 3xx 重定向,则将 window.location 设置为新的 URL 以指示浏览器加载新的重定向页面。