如何解决Salesforce发送带查询参数的HTTP URL请求失败问题
解决Salesforce请求KoboToolbox带查询参数返回404的问题
核心原因
直接在APEX里拼接包含JSON结构的query参数到URL时,JSON里的{、}、:等特殊字符没有被URL编码,导致KoboToolbox服务器无法正确解析请求路径,返回404错误。Postman会自动对URL参数进行编码,所以能正常工作。
解决步骤
1. 对查询参数做URL编码
用Salesforce的EncodingUtil.urlEncode()工具类对整个query参数的JSON值进行编码,确保特殊字符被正确转义。修改后的代码如下:
HttpRequest req = new HttpRequest(); String koboproject = 'aMeaT8CnGtoTTmooz3uKkq'; String LastDate = '2023-11-16T01:02:03'; // 先构造完整的查询JSON String queryJson = '{"_submission_time": {"$gt":"' + LastDate + '"}}'; // 对JSON字符串做UTF-8编码 String encodedQuery = EncodingUtil.urlEncode(queryJson, 'UTF-8'); // 拼接端点时使用编码后的参数 String endpoint = 'https://eu.kobotoolbox.org/api/v2/assets/' + koboproject + '/data/?format=json'; endpoint += '&query=' + encodedQuery; endpoint += '&limit=3'; // 按需添加limit参数 req.setEndpoint(endpoint); System.debug(endpoint); req.setMethod('GET'); req.setHeader('Authorization', 'Bearer b4c6cdf15eb891ab2a29495a02355d98925f9b2d'); req.setHeader('Accept', 'application/json'); Http http = new Http(); HttpResponse resp = http.send(req); System.debug('RESP CODE:' + resp.getStatusCode()); if (resp.getStatusCode() == 200) { return resp.getBody(); } else { return 'failed!'; }
2. 确认远程站点设置(基础验证)
虽然你不带查询参数的请求能成功,但还是可以再确认下远程站点配置:
- 进入Salesforce Setup,搜索「远程站点设置」
- 检查是否存在
https://eu.kobotoolbox.org的条目,没有的话就添加,勾选「启用远程站点」
3. Lightning环境需检查CSP信任站点(可选)
如果是在Lightning组件里发起的请求,还要确认内容安全策略(CSP)是否信任该域名:
- 进入Setup,搜索「CSP信任站点」
- 添加
https://eu.kobotoolbox.org,确保允许GET请求
内容的提问来源于stack exchange,提问作者Carlton Foster
相关产品推荐
相关产品推荐

