课程章节介绍
同学们,咱们今天来看一个在实际开发中很容易踩到的坑,就是在同一个事务里,什么时候不能进行HTTP调用,以及一些相关的注意点。
你可能在代码里先做了一些数据库操作、发邮件或者调用了异步方法,然后又想马上发一个HTTP请求出去,这时候Salesforce就会报错。规则其实很清楚:,当你的事务中还存在“挂起的操作”时,是不允许再发起外部调用的。,
那什么是挂起的操作呢?简单说,就是还没真正提交到数据库、或者还没结束的异步工作。比如:
- 执行了DML语句(插入、更新、删除记录),但事务还没结束;
- 调用了未来的方法(@future)、批处理作业;
- 安排了计划Apex;
- 或者发送了电子邮件。
这些都属于挂起的操作。如果你在它们之后紧接着写了一个HTTP callout,系统就会阻止你。
那如果想先做一些数据库改动,又能调用外部服务,怎么办呢?一个办法是在执行这些操作,之前,,先创建一个保存点(savepoint)。保存点能让你在后续出错时把数据回滚到这个地方,很多业务场景里会这么用。但注意哦,保存点本身并不能解除调用的限制,它只是帮你更好地控制事务——要解决限制,通常的做法是先做callout,拿到结果后再做DML。其实你可以反过来安排顺序:先完成HTTP调用,再去操作数据库。
另外还有一个测试时的小特例:在单元测试里,如果你用的是“模拟调用”,挂起的操作是可以在模拟调用之前发生的。因为模拟调用并不会真的去连外部服务器,所以系统就放宽了这个限制。这一点对咱们写测试类很有用。
最后再说一个跟HTTP调用超时有关的情况。当你的HTTP请求里添加了 `Expect: 100-Continue` 这个请求头,意思是告诉服务器:“先别急着发请求体,你确认能接收我再发。” 这种情况下,如果外部服务器没有及时返回 `HTTP/1.1 100 Continue` 这个确认响应,那请求就会超时。所以使用时一定要确保对方服务器支持这个机制,否则反而会让你的调用卡住。
好了,这页就是强调调用顺序的约束和几个容易疏忽的点。实际项目中只要记住:,事务里有DML或异步操作时,别在它们后面放callout,,早一点把调用完成就好。继续加油!
关键词
Apex
Salesforce
Developer Guide