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
相关产品推荐
相关产品推荐

