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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:56:34