【问题标题】:Posting to Capsule CRM and an "AJAX Proxy"发布到 Capsule CRM 和“AJAX 代理”
【发布时间】:2015-01-06 08:56:57
【问题描述】:

我正在尝试使用 http://support.capsulecrm.com/customer/portal/articles/1639817-website-contact-form-integration 发布 Capsule CRM 页面,我可以很容易地开始工作。但是,我想使用 AJAX 发布此内容,但一直遇到 CORS 错误。 Capsule CRM 人员已将其关闭,因此您无法使用 AJAX 提交而不会遇到此错误。

联系他们后,我得到了这样的回复:

要使用 AJAX 处理您的请求,您的网站需要额外的 将在您的网站上处理您的网络表单 POST 的页面,而不是 直接发送到 Capsule。这有时被称为 AJAX 代理。此页面只是将帖子转发到 Capsule 网络表单 url 对于处理,如果您没有在帖子中指定“COMPLETE_URL” 表单将返回 HTTP 200 响应而不是重定向 对你来说更容易处理。

我花了很大一部分时间在互联网上寻找“AJAX 代理”,我似乎找不到一个示例,并且开始努力让它工作。希望一些代码可以帮助解决我的问题。

form.html

<form id="contact-form" class="form">
  <label>Name: </label>
  <input type="text" name="PERSON_NAME" placeholder="Name" value="" required/>
  <label>Email: </label>
  <input type="email" name="EMAIL" placeholder="Email" value="" required  /><br>
  <label>Telephone: </label>
  <input type="text" name="PHONE" placeholder="Telephone number" value="" required /><br>
  <input type="submit" name="submit" value="Submit" />
</form>
<div class="result">
</div>

form.js

$(document).ready(function() {

$('.form').submit(function(event){

    event.preventDefault();
    var messages = $('#result');
    var formData = $('.form').serialize();

    $.ajax({
        type        : "POST",
        url         : capsule.php,
        data        : formData
    })  
    .done(function(response) {
            console.log("Success: " + response);
        }
    })
    .error(function(response)   {
            console.log("Error: " + response);
        }
    });
});

capsule.php

<?php
<form action="https://service.capsulecrm.com/service/newlead" method="post">
    <input type="hidden" name="FORM_ID" value="XXXXXXXXXXXXXXXXXXXXXXXX">
    <input type="text" name="FIRST_NAME" value="$_POST['PERSON_NAME']">
    <input type="text" name="LAST_NAME" value="$_POST['PERSON_NAME']">
    <input type="text" name="EMAIL" value="$_POST['PERSON_NAME']">
</form>
?>

我几乎需要做一个双重职位。我需要将数据发布到 Capsule.php,然后我需要将其发布。如果该响应成功,则将其全部反转并更新 form.html 而无需刷新。或者有人知道我应该如何形成“AJAX 代理”吗?

这是我第一次单独研究 AJAX,所以请保持温和 :)。

编辑

在尝试了下面的答案并进行了调试后,我在开发人员工具的控制台中恢复了这个。由于我无法访问 Capsules CRM 服务器,因此很难调试,因此我目前也在通过电子邮件向他们发送有关我遇到的问题的电子邮件:

(
    [url] => https://service.capsulecrm.com/service/newlead
    [content_type] => 
    [http_code] => 404
    [header_size] => 315
    [request_size] => 206
    [filetime] => -1
    [ssl_verify_result] => 0
    [redirect_count] => 0
    [total_time] => 0.397695
    [namelookup_time] => 0.045858
    [connect_time] => 0.109964
    [pretransfer_time] => 0.268374
    [size_upload] => 705
    [size_download] => 0
    [speed_download] => 0
    [speed_upload] => 1772
    [download_content_length] => 0
    [upload_content_length] => 705
    [starttransfer_time] => 0.333441
    [redirect_time] => 0
)

感谢大家的耐心等待!

【问题讨论】:

  • 您对 AJAX 代理概念的理解不正确。 capsule.php 脚​​本不应包含 html 表单,它应从 form.html 接收 AJAX 请求数据,并通过 POST 请求将其发送/传递到 Capsule CRM 页面。这可以通过多种方式完成:CURL、file_get_contents 等..
  • 你有代码示例吗?我不确定哪些胶囊将支持发布数据?只要它具有这些字段名称(PERSON_NAME、EMAIL 等),它似乎就可以工作。
  • 你已经差不多了。 hindmost的评论和回答都不错。术语代理是指充当处理请求的中介的任何软件。在这种情况下,需要中介,因为您不能直接发布 Ajax 请求。因此,将有 2 个与您描述的完全一样的帖子。我可以在您的代码中发现的唯一另一件事是,在您的 JavaScript 中,您需要在 URL 周围加上引号,例如url: 'capsule.php'

标签: javascript php jquery ajax proxy


【解决方案1】:

你误解了 AJAX 代理的概念。

capsule.php 脚本不应包含表单 HTML,它应从 form.html 接收 AJAX 请求数据,并通过 POST 请求将其发送/传递到 Capsule CRM 页面。这可以通过多种方式完成:CURL、file_get_contents() 等。

以下是 CURL 的实现:

$ch = curl_init();
curl_setopt_array($ch, array(
    CURLOPT_URL => 'https://service.capsulecrm.com/service/newlead',
    CURLOPT_NOBODY => false,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $_POST,
    CURLOPT_SSL_VERIFYPEER => false,
));
$response = curl_exec($ch);
if ($response && curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200)
    return $response;
header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');

【讨论】:

  • 我已尽我所能实现了这一点(即,我已将所有字段复制并粘贴并移动到我需要的实际表单中)但是在本地测试时我得到: XMLHttpRequest cannot load file :PATHTOFILE/capsule.php。跨源请求仅支持协议方案:http、data、chrome-extension、https、chrome-extension-resource。这是我一开始就试图避免的。有什么建议吗?
  • @KirisuteRanza AFAIU,您正在将网页加载为本地文件(通过file:// 协议),这就是问题的原因。 AJAX 请求不适用于本地文件。您的网页应该可以通过 http 协议访问。所以你必须把它放在网络服务器上
  • 啊,好吧,我想我在测试时有点过早了。今晚我可以访问我的网络服务器时尝试一下。感谢您的耐心@hindmost
  • 我现在已经设法将它放到我的服务器上。但是,行 header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');是我回来的。 (IE 控制台给出 404 错误。我将其更改为 403 并表示禁止等。)无论如何我可以调试这个?
  • @KirisuteRanza 将此行 print_r(curl_getinfo($ch)); 添加到脚本中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多