我正在使用 Python zeep使用 SOAP 与 Salesforce 的元数据 API 进行交互。
我试图从最简单的事情开始,只需登录并读取元数据对象。
from zeep import Client as zClient
client = zClient('sf_config/sf_metadata_40.xml',
wsse=UsernameToken('bub@bob.com', 'scary_secretPassW*rd')
// readMetadata method exists, prints <zeep.client.OperationProxy object at ...>
print client.service.readMetadata
// errors because login method does not exist
print client.service.login
问题是,Salesforce 要求您将您指向的端点更改为您在登录请求 ( docs ) 的响应中获得的 URL。但我不知道如何进行这样的登录调用。我上面的代码似乎通过在对象的构造中使用用户名和密码来隐藏该登录调用client。
因此,执行这样的readMetadata方法会client.service.readMetadata()导致此错误:
Fault: UNKNOWN_EXCEPTION: Destination URL not reset. The URL returned from login must be set in the SforceService
所以我的问题是如何在 Python 中对 SOAP API 进行登录调用?
(Salesforce文档中的 Java 示例使用了一个connection我不太确定 Python zeep 等价物是什么的对象,所以我没有示例可以参考。)
编辑:
顺便说一句,我已经在 Salesforce 堆栈交换中询问过,但认为zeep即使他们不了解 Salesforce,也可以由知道的人来回答,因此也值得在这里发布。
更新:
对于身份验证,我已经使用 OAuth 流程来获取访问令牌,用于 REST API,因此我将重用该身份验证方法/访问令牌。这将我的问题改为:
1)我如何使用访问令牌(我相信它取代了 sessionID)然后向元数据 API 发出请求?
2)如果我使用 OAuth 流来获取访问令牌,我仍然缺少元数据 API 服务器 url,那么我怎样才能得到它(或构造它,比如https://server-api.salesforce.com/services/Soap/m/40.0/orgId或其他东西)?