能否在Salesforce中创建兼具POST请求与跳转的自定义URL按钮?
解决方案:Salesforce自定义按钮实现后台POST+内部跳转
一、你的Visualforce页面思路是否可行?
该思路是可行的,但需要优化两点:确保POST请求完成后再跳转,以及规避CSRF风险。你的原始示例中直接执行跳转可能导致请求未完成就中断,同时需确保外部端点支持CSRF防护(比如验证请求来源或使用令牌),Salesforce Visualforce页面本身的安全机制也能提供基础防护。
优化后的Visualforce页面代码:
<apex:page > <script> window.onload = function() { // 构造要发送的数据,可直接引用Salesforce字段 const customData = { field1: 'value1', field2: '{!Account.Id}' }; const xhr = new XMLHttpRequest(); xhr.open("POST", "https://example1.com/example1.php", true); xhr.setRequestHeader("Content-Type", "application/json"); // 请求完成后再执行跳转 xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 300) { // 构造目标Apex组件的URL const targetUrl = '/apex/my_component?SourceID={!Account.Id}&PARAM1=Email~john.doe@example.com&PARAM2=Something'; window.location.replace(targetUrl); } else { alert('数据发送失败,请重试'); window.location.replace('/{!Account.Id}'); // 跳回原记录页 } }; xhr.onerror = function() { alert('数据发送失败,请检查网络'); window.location.replace('/{!Account.Id}'); }; xhr.send(JSON.stringify(customData)); }; </script> </apex:page>
对应的URL按钮代码:
{!URLFOR('/apex/myPage', null, [AccountId=Account.Id])}
(若需传递记录ID,可通过URLFOR传参,页面内用{!$CurrentPage.parameters.AccountId}获取)
二、更优方案:直接用JavaScript按钮实现,无需Visualforce
你可以在JavaScript按钮中直接构造跳转URL,替代URLFOR的功能,无需依赖额外Visualforce页面,流程更简洁。
完整JavaScript按钮代码:
{!REQUIRESCRIPT("/soap/ajax/37.0/connection.js")} function sendCustomDataAndRedirect() { const customData = { field1: 'value1', field2: '{!Account.Id}' }; const xhr = new XMLHttpRequest(); xhr.open("POST", "https://example1.com/example1.php", true); xhr.setRequestHeader("Content-Type", "application/json"); xhr.onload = function() { if (xhr.status >= 200 && xhr.status < 300) { // 构造目标Apex组件的URL,完全替代URLFOR const targetUrl = '/apex/my_component?' + 'SourceID={!Account.Id}' + '&PARAM1=Email~john.doe@example.com' + '&PARAM2=Something'; window.location.href = targetUrl; } else { alert('数据发送失败,请重试'); } }; xhr.onerror = function() { alert('数据发送失败,请检查网络'); }; xhr.send(JSON.stringify(customData)); } sendCustomDataAndRedirect();
该方案优势:
- 无需创建额外Visualforce页面,降低维护成本
- 逻辑集中在按钮内,流程更直观
- 避免中间页面跳转的额外步骤
三、关键注意事项
- 异步请求处理:必须在
xhr.onload回调中执行跳转,确保POST请求完成后再跳转,避免数据未发送就中断 - CSRF防护:若外部端点有CSRF验证,需在请求中携带对应令牌(如从外部端点获取后加入请求头或参数)
- 跨域配置:需将外部端点添加到Salesforce的「远程站点设置」(Setup > Remote Site Settings),同时确保对方端点允许你的Salesforce域名跨域访问
- 权限控制:确保按钮所属的用户权限集允许执行相关操作
内容的提问来源于stack exchange,提问作者Jesse
相关产品推荐
相关产品推荐

