繁体   English   中英

Ajax将POST发送到两个URL

[英]Ajax send POST to two URLs

在我的网站上,我想将POST数据发送到两个不同的URL,并稍微修改每个URL的数据。 一个是软输液,另一个是我的另一个网站上的API。

注意#1:我将使用示例文本替换我的个人API的URL。

注意2:是否必须设置内容类型,或者在发送表单数据之前是否缺少其他标头/信息? 如果是这样,为什么要在台式机上完美运行呢? 这段代码曾经全部用在jQuery中,但效果不佳,所以我试图用Vanilla JS重写整个代码,只是为了摆脱依赖问题的想法。

注意#3: No 'Access-Control-Allow-Origin' header is present on the requested resource.
^这与Infusion Soft和我的个人API有关。 我假设即使没有在Infusion Soft上设置它也不是问题,尤其是考虑到一切都可以在桌面上完美运行的事实。

注意#4:每个选择器和所有选择器都匹配一个元素。 再也没有错别字,在台式机上运行时可以100%使用
Windows 10 Home
Chrome Version 61.0.3163.100 (Official Build) (64-bit)

注意#5:表格上的操作转到Infusion Soft。 我阻止了默认事件的发生,因此我可以处理数据,然后将其发送到我们的数据库。 完成之后,我再次使用数据,然后让Infusion Soft运行action属性-您可以在代码中看到所有内容。

我的代码如下:

<script>

var form = document.getElementById('RequestADemo');
document.getElementById('submitButton').addEventListener('click', processData);

function processData(e){

  e.preventDefault();

  var phone = document.getElementById('inf_field_Phone1').value;

  var formData = new FormData(form);
  formData.append('action', 'insertLead');
  formData.append('inf_field_Phone', phone);

  var oReq = new XMLHttpRequest();
  oReq.open('POST', 'http://example.com/api.php', true);
  oReq.send(formData);

  var fullName = document.getElementById('inf_field_FirstName').value;
  var fullNameSplitted = fullName.split(' ');

  var firstName = fullNameSplitted[0];

  if (fullNameSplitted.length > 1) {
    var lastName = fullNameSplitted[1];
  }

  var formData2 = new FormData(form);
  formData2.delete('inf_field_FirstName');
  formData2.append('inf_field_FirstName', firstName);
  formData2.append('inf_field_LastName', lastName);

  var oReq2 = new XMLHttpRequest();
  oReq2.open('POST', form.getAttribute('action'), true);
  oReq2.send(formData2);

  form.reset();

  alert('Thanks! We will contact you shortly. Check your email for a confirmation.');

}

</script>

该代码在台式机上运行完美,并且可以同时提交给我的个人API和Infusion Soft。 在我们的API中,我们负责名字和姓氏的分割,并将它们插入数据库中的单独字段中。 但是,对于Infusion Soft,由于无法控制其API,因此需要在发送数据之前执行此操作。 所有这些都按计划在桌面上运行。

在Safari的iPhone7上,此代码按计划插入到我的个人数据库中,但并未插入到Infusion Soft中。 我用console.log();测试了一些东西console.log(); 并发现

var FormData2 = new FormData(form);

是移动设备上出现问题的那条线。

这条线之前的一切在移动设备上都运行完美。

有任何想法吗? 我真的很感激!

**更新:**

这是我发送给Infusion Soft的第二个请求的新变量和代码:

  var email = document.getElementById('inf_field_Email').value;
  var company = document.getElementById('inf_field_Company').value;
  var phone = document.getElementById('inf_field_Phone1').value;

  var fullName = document.getElementById('inf_field_FirstName').value;
  var fullNameSplitted = fullName.split(' ');

  var firstName = fullNameSplitted[0];

  if (fullNameSplitted.length > 1) {
    var lastName = fullNameSplitted[1];
  }

  var formData2 = new FormData();
  formData2.append('inf_field_FirstName', firstName);
  formData2.append('inf_field_LastName', lastName);
  formData2.append('inf_field_Email', email);
  formData2.append('inf_field_Company', company);
  formData2.append('inf_field_Phone1', phone);

  var oReq2 = new XMLHttpRequest();
  oReq2.open('POST', form.getAttribute('action'), true);
  oReq2.send(formData2);

但是,这不适用于台式机或移动设备! :(但是最后的警报确认正在通过。

解决了

正如@Barmar在评论中提到的那样,我必须创建一个空的FormData并手动附加所有值。 我这样做了,起初它没有用。 我想通了,是我是我追加送输液软的所有值,但解决的办法是把所有的隐藏字段输液软让你在无样式的HTML表单和它们的值也是如此。

我只需要制作这些附加表单,这些附加表单就是其他3个隐藏字段:

formData2.append('inf_form_xid', xid);
formData2.append('inf_form_name', isFormName);
formData2.append('infusionsoft_version', isVersion);

请注意,在此代码块之前,我已经将变量设置为其值。 Infusion Soft除非接受这些值,否则不得接受数据,这是完全有意义的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM