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

Posted

技术标签:

【中文标题】post api调用和使用post方法提交表单有啥区别?【英文标题】:What is the difference between post api call and form submission with post method?post api调用和使用post方法提交表单有什么区别? 【发布时间】:2020-02-02 11:05:08 【问题描述】:

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

【问题讨论】:

【参考方案1】:

表单数据通常是这样发送的

address=***&poster=Ashkay

而 JSON 格式的普通帖子会是这样的


   "address": "***",
   "poster": "Ashkay"

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

const request = require("request");

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

【讨论】:

【参考方案2】:

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

    html 表单,提交按钮,用户按下提交按钮,不涉及 javascript。 页面中的 HTML 表单,Javascript 获取表单的 DOM 元素并在表单对象上调用 .submit() 方法。 Ajax 调用使用带有 POST 方法的 XMLHttpRequest 接口并手动发送适当的表单数据。 使用 POST 方法调用 Ajax Fetch 并手动发送适当的表单数据。

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

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


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

带有 XMLHttpRequest 的编程 Ajax 调用不会以任何方式处理重定向或来自 Ajax 调用的响应。他们只是将该响应返回给您的 Javascript。请记住,重定向只是您可以从 Ajax 调用返回的一种特定类型的响应。这与浏览器提交表单 POST 不同。

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

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

当您通过 Ajax 提交表单时,浏览器不会自动处理服务器响应。该响应返回到您的 Javascript,您的脚本决定如何处理它。如果您希望您的脚本遵循重定向,那么您必须检查响应,查看它是否为 3xx 状态,从相应的标头获取新 URL 并将 window.location 设置为该新 URL。这将导致浏览器显示重定向页面。但是,您必须自己编程,或者找到一个提供功能的 Ajax 库来实现它。一个标准的 Ajax 调用只是将表单 POST 响应返回给您的 Javascript——仅此而已。您的脚本必须处理该响应并决定下一步该做什么。

我很困惑,我无法使用 post API 调用网关,因为它不会重定向到新页面

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

【讨论】:

感谢您的许可,window.location 到新页面会将我重定向到新页面,但它不会像支付网关页面那样是对该页面的发布请求。我想我必须使用带有动作的表单发布方法来向网关页面发送发布请求。 某些 url 不允许获取请求。 https://***.com/a/133997/6790744 我可以动态创建表单元素并在javascript中点击请求。 @AkshayBande - 我不明白你现在问的是什么问题。也许您需要创建一个新问题。您可以使用 Javascript 或 HTML 表单发布。只有使用 HTML 表单(不是通过 Javascript)自动发布才会自动更新浏览器的显示。是的,您可以使用 Javascript 在当前页面中创建表单。 我想通过使用javascript api调用重定向到form post action这样的新页面。 https://***.com/a/133997/6790744 告诉我,我可以通过动态创建表单来使用 javascript 对表单等 URL 进行 post 调用。我认为仅使用 API,我可以使用 winodw.location 进行重定向,但这不会像对 url 的发布请求一样。

以上是关于post api调用和使用post方法提交表单有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

jsp调用servlet时get方法和post方法有啥区别?

bottle.post()python有啥用

使用 JSON 格式的 POST 方法 web api 将动态输入提交到数据库

php提交参数很多的表单 有啥简单的办法

HttpClient Post 提交表单数据

使用 javascript 函数调用模拟 post 表单提交