使用Python调用Salesforce API查询Opportunity数据时遭遇MALFORMED_QUERY错误
解决Salesforce Opportunity查询时的MALFORMED_QUERY错误
咱们直接说问题根源:你遇到的这个错误,核心原因是手动在SOQL查询里用+代替了空格。Salesforce的SOQL解析器会把这些+当成字面量字符,而不是空格的URL编码,所以才会抛出「unexpected token: '+'」的语法错误。
下面给你具体的解决步骤和优化建议:
1. 用正常空格编写SOQL,不要手动编码
把查询语句里的+全部换成普通空格,让你的HTTP请求库自动处理URL编码(大部分Salesforce API客户端都会自动完成这件事):
opportunity_id = "0061g00000BRG00AAH" # 用空格分隔SOQL的各个部分,不要手动加+ query = f"SELECT FIELDS(ALL) FROM Opportunity WHERE ID = '{opportunity_id}'"
2. 修正后的完整代码
替换你的原有代码,改成这样即可正常执行:
import json opportunity_id = "0061g00000BRG00AAH" query = f"SELECT FIELDS(ALL) FROM Opportunity WHERE ID = '{opportunity_id}'" # 调用API时直接传正常的查询字符串,让底层库处理编码 response = sf_api_call('/data/v51.0/query/', {"q": query}) print(json.dumps(response))
3. 额外优化:避免SOQL注入风险(推荐)
虽然你这里用的是固定ID,但养成好习惯,尽量用绑定变量的方式传递参数,防止潜在的注入问题:
opportunity_id = "0061g00000BRG00AAH" # 使用绑定变量占位符:opp_id query = "SELECT FIELDS(ALL) FROM Opportunity WHERE ID = :opp_id" # 把变量单独传入,具体参数名可根据你的sf_api_call实现调整 response = sf_api_call('/data/v51.0/query/', {"q": query, "variables": {"opp_id": opportunity_id}})
4. 注意FIELDS(ALL)的使用限制
如果之后还是出现异常,要注意FIELDS(ALL)在Salesforce REST API里有一些限制:
- 需要API版本40.0及以上
- 不能和
LIMIT之外的其他查询修饰符混用 - 某些特殊字段可能无法通过
FIELDS(ALL)返回
这种情况下,可以直接指定需要的字段代替FIELDS(ALL),比如:
query = f"SELECT Id, Name, StageName, Amount, CloseDate FROM Opportunity WHERE ID = '{opportunity_id}'"
内容的提问来源于stack exchange,提问作者Eathekilla
相关产品推荐
相关产品推荐

