我会尽量让这件事变得简单。我已经尝试了很多东西并且已经研究了一段时间,我想我错过了一些小东西。
使用 Angular 12。
样品形式:
<form id="my-form" action="https://example.com" action="post">
<input name="fname">
<button (click)="mySubmitFunction()">SUBMIT</button>
</form>
我有mySubmitFunction()
这样的逻辑:
const myForm = document.querySelector('#my-form') as HTMLFormElement;
myForm.submit();
使用这种方法,会发生表单提交,它需要每个<input>
具有name
属性来填充表单数据。您可以在 Chrome 的开发者工具中看到生成的 http 请求,例如在网络选项卡中。
我的问题是数据发送给第三方供应商,并且发生重定向,重定向到我们告诉他们的任何内容(在这种情况下,它是同一页面)。因此,用户体验是不仅此表单数据,而且页面上的所有其他内容都被清除。
我所看到的大多数示例基本上都是不使用操作/方法/提交方法,而是定义一个按钮单击方法,从头开始创建一个 http 请求(这是我实际尝试的第一件事)。问题在于,http.post
无论在什么环境下,我都会在请求中遇到 CORS 问题。这基本上是我在那里做的事情:
postContactInfoToVendor(requestBody: string): Observable<any> {
const headers = {
'Content-Type': 'application/x-www-form-urlencoded'
};
// Where the requestBody is formatted like 'fname=Bob'
return this.http.post(environment.vendorUrl, requestBody, { headers });
}
所以我有点卡住了,想知道那里的许多伟大的思想是否已经解决了这个问题,我就是找不到。
我还注意到随着表单的 submit() 请求发送了很多额外的标头,但我不知道它们来自哪里 - 想知道这是否有助于解决 CORS 问题。诸如带有“visitor_id”类型条目的“Cookie”之类的标头等。
我正在考虑的可能解决方案:
iframe
在页面上托管我的联系表格。然后在我们能够在供应商方面配置的成功重定向上,可以转到感谢页面。以某种方式拦截 form.submit() 的请求,取消该请求并发送一个使用完全相同的标头建模的新请求。不过,我目前无法拦截这些请求。
一如既往,感谢您的帮助。
更新:我的具体问题是 Pardot 表单提交。Angular 中有一个解决方法,尽管我不确定我对此有何感受。
将来自Simulate a JSONP response with JavaScript URLs和How to make a simple JSONP asynchronous request in Angular 2 中的信息拼凑起来?,我能够导入HttpJsonpModule
并使用它
http.jsonp(url + urlEncodedString, 'callback');
然后,我将成功/错误 URL 配置为静态托管的 json 文件,这些文件将在相应的响应中返回,以用于成功/错误回调(据我所知)。我将在接下来的几天内对其进行测试,但只是想提供最新的更新。
虽然,一般来说,我知道我的<iframe>
解决方案也会奏效:)
更新:我已经完成了我的解决方案,不是使用 HTMLFormElement.submit(),也不是 http.post,而是一个 http.jsonp() 请求,只是因为服务器端支持 JSONP。
我很快就会在这里写下我自己的答案以及所有信息。