You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Salesforce HTTP Callout调用LinkPreview API返回403(无效密钥)问题

问题描述

尝试调用免费的LinkPreview API,已正确配置Salesforce远程站点设置,该API仅需在URL参数中携带API密钥即可访问,支持GET和POST请求。通过Thunder Client(类似Postman)及浏览器均可正常访问该API,但使用Apex类或匿名执行(exec anon)调用时,始终返回403错误,API文档提示此错误为“Invalid or blank API access key”。曾尝试设置User-Agent,但无效果。

测试用最简匿名执行代码如下:

Http http = new Http();
HttpRequest request = new HttpRequest();
request.setEndpoint('https://api.linkpreview.net?q=www.cnn.com&key=[my key here]');
request.setMethod('GET');
HttpResponse response = http.send(request);
System.debug('🟢 ' + response.getStatus());

日志中显示的完整端点在浏览器中可正常获取结果,且在多个Salesforce环境(沙盒、开发、生产)测试均出现相同问题。已联系API开发者但暂无反馈,请问可能是什么原因导致Salesforce发起的请求异常?


可能的原因及排查方向
  • URL参数转义错误:代码中端点URL里的&是HTML转义字符,在Apex字符串中直接使用会导致URL被解析为q=www.cnn.com&key=[my key],而非正确的q=www.cnn.com&key=[my key]。API服务会把&当作参数名的一部分,导致密钥参数无法被正确识别。应将&替换为直接的&。
  • API密钥未正确编码:如果你的API密钥包含特殊字符(如&、=、%等),直接拼接在URL中会破坏参数结构,导致服务端接收的密钥不完整或被截断。需使用EncodingUtil.urlEncode()对密钥进行URL编码后再拼接,示例:
    String encodedKey = EncodingUtil.urlEncode('[my key here]', 'UTF-8');
    request.setEndpoint('https://api.linkpreview.net?q=www.cnn.com&key=' + encodedKey);
    
  • Salesforce出站IP未加入API白名单:部分API服务会限制请求来源IP,Salesforce的出站IP是动态且范围较广的,若API服务商启用了IP白名单,而未将Salesforce的全部出站IP加入,会导致请求被拦截。可查询对应Salesforce环境的出站IP范围,提交给API服务商添加白名单。
  • 请求头缺失必要字段:除User-Agent外,浏览器或Thunder Client会自动携带一些默认请求头(如Accept、Accept-Language等),部分API服务会依赖这些头信息验证请求合法性。尝试模拟浏览器的请求头,示例:
    request.setHeader('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');
    request.setHeader('Accept-Language', 'en-US,en;q=0.5');
    
  • 远程站点设置的URL范围不匹配:虽然已配置远程站点,但需确认设置的URL是否完全覆盖API端点。比如远程站点URL是否为https://api.linkpreview.net(不带任何路径或参数),若设置了更窄的路径范围,可能导致请求被Salesforce拦截。

内容的提问来源于stack exchange,提问作者PatMcClellan__c

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:13:20