【发布时间】:2023-01-24 14:09:44
【问题描述】:
我想调用支付网关,因为使用表单提交调用支付网关的方法为post,我可以使用来自节点 js HTTP 模块的 post API 调用来调用同一个网关吗,我很困惑,我不能调用网关使用post API 导致它不会重定向到新页面,并且表单有 method 和 action 可以通过 post 调用重定向到新页面?
【问题讨论】:
标签: javascript node.js api post payment
我想调用支付网关,因为使用表单提交调用支付网关的方法为post,我可以使用来自节点 js HTTP 模块的 post API 调用来调用同一个网关吗,我很困惑,我不能调用网关使用post API 导致它不会重定向到新页面,并且表单有 method 和 action 可以通过 post 调用重定向到新页面?
【问题讨论】:
标签: javascript node.js api post payment
从浏览器提交表单有多种方式:
.submit() 方法。使用#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 到新页面会将我重定向到新页面,但它不会像支付网关页面那样像我想要的那样是对该页面的发布请求。我想我必须使用带有操作的表单发布方法来将发布请求发送到网关页面。
https://stackoverflow.com/a/133997/6790744 我可以动态创建表单元素并在 javascript 中点击请求。
.submit() 方法。这通常会像完全 HTML 提交一样工作。除了遵循重定向之外,我仍然不明白您试图通过表单响应解决什么实际问题。由于您从未描述过问题的那一部分,所以我不知道如何帮助您。
表单数据通常像这样发送
address=Stackoverflow&poster=Ashkay
而 JSON 格式的普通帖子就像
{
"address": "stackoverflow",
"poster": "Ashkay"
}
您可以在 NodeJS 中模拟表单 POST 请求,例如:
const request = require("request");
request({
uri: "http://www.test.com/payment/gateway.php",
method: "POST",
form: {
address: "Stackoverflow",
name: "Ashkay"
}
}, function(error, response, body) {
console.log(body);
});
【讨论】: