Salesforce-API

Salesforce API(8)SOAP外调

学习目标

完成本单元后,您将能够:

  • 使用WSDL2Apex生成Apex类。
  • 执行标注以使用SOAP将数据发送到外部服务。
  • 使用模拟标注测试标注。

使用WSDL2Apex生成Apex代码

除了REST标注外,Apex还可以使用XML对SOAP Web服务进行标注。使用SOAP可能是一个痛苦的(但必要的)经验。幸运的是,我们有工具来简化这个过程。
WSDL2Apex从WSDL文档自动生成Apex类。您下载Web服务的WSDL文件,然后上传WSDL,WSDL2Apex为您生成Apex类。 Apex类构造SOAP XML,传输数据,并将响应XML解析到Apex对象中。而不是开发构建和分析Web服务消息的XML的逻辑,让由WSDL2Apex生成的Apex类在内部处理所有这些开销。如果您熟悉WSDL2Java或使用.NET作为Web引用导入WSDL,则此功能类似于WSDL2Apex。别客气。

注意

尽可能使用出站消息处理集成解决方案。仅在必要时才使用对第三方Web服务的标注。

对于这个例子,我们使用一个简单的计算器Web服务来添加两个数字。这是一个开创性的服务,是所有的愤怒!我们需要做的第一件事是下载WSDL文件来生成Apex类。点击此链接并将calculator.xml文件下载到您的计算机上。记住你保存这个文件的位置,因为你在下一步需要它。

从WSDL生成一个Apex类

  1. 从“设置”中,在“快速查找”框中输入“Apex类”,然后单击 Apex Classes.
  2. 点击 Generate from WSDL.
  3. 点击 Choose File 然后选择下载的calculator.xml文件。
  4. 点击 Parse WSDL. 应用程序为WSDL文档中的每个名称空间生成默认的类名称,并报告任何错误。

    对于这个例子,使用默认的类名称。但是,在现实生活中,强烈建议您更改默认名称,以使其更易于使用,并使代码更直观。

    现在该坦诚地谈谈WSDL解析器了。 WSDL2Apex解析是一个臭名昭着的善变。解析过程可能由于多种原因而失败,例如不支持的类型,多个绑定或未知元素。不幸的是,您可能会被迫手动编写调用Web服务的Apex类或使用HTTP。

  5. 点击 Generate Apex code. 向导的最后一页显示生成的类以及任何错误。该页面还提供链接以查看成功生成的代码。
    生成的Apex类包括用于调用由WSDL文档表示的第三方Web服务的存根类和类类。这些类允许您从Apex调用外部Web服务。对于每个生成的类,使用相同的名称和前缀Async创建第二个类。 calculatorServices类用于同步标注。 AsyncCalculatorServices类用于异步标注。

执行标注

先决条件

在运行此示例之前,请使用“授权端点地址”部分中的步骤来授权Web服务标注的端点URL https://th-apex-soap-service.herokuapp.com

现在你可以执行标注,看看它是否正确添加两个数字。有一个计算器,方便检查结果。

  1. 从设置档(打开设备齿轮图标Setup gear icon)打开开发者控制台。
  2. 在开发者控制台中,选择 Debug | Open Execute Anonymous Window.
  3. 删除所有现有的代码,并插入下面的代码片段。
    calculatorServices.CalculatorImplPort calculator = new  calculatorServices.CalculatorImplPort();
    Double x = 1.0;
    Double y = 2.0;
    Double result = calculator.doAdd(x,y);
    System.debug(result);
  4. 选择 Open Log, 然后单击 Execute.
  5. 调试日志打开后,单击调试只查看System.debug语句的输出。日志应该显示3.0。

测试Web服务标注

所有有经验的Apex开发人员都知道,要部署或打包Apex代码,至少有75%的代码必须具有测试覆盖率。这个覆盖范围包括我们由WSDL2Apex生成的类。您以前可能听说过这个,但测试方法不支持Web服务标注,执行Web服务标注的测试失败。所以,我们有一点工作要做。为了防止测试失败并增加代码覆盖率,Apex提供了一个内置的WebServiceMock接口和Test.setMock方法。您可以使用此接口在测试方法中接收假响应,从而提供必要的测试覆盖率。

为标注指定模拟响应

当您从WSDL创建Apex类时,自动生成的类中的方法调用WebServiceCallout.invoke,该方法执行对外部服务的调用。在测试这些方法时,只要调用WebServiceCallout.invoke,就可以指示Apex运行时生成一个假响应。为此,请实现WebServiceMock接口并指定测试运行时发送的假响应。

指示Apex运行时通过在您的测试方法中调用Test.setMock来发送此假响应。对于第一个参数,传递WebServiceMock.class。对于第二个参数,传递一个WebServiceMock接口实现的新实例。

Test.setMock(WebServiceMock.class, new MyWebServiceMockImpl());
这很重要,所以让我们来看一个完整的示例代码。在这个例子中,你创建了一个名为callout的类,一个用于测试的模拟实现和一个测试类本身。
  1. 在开发者控制台中,选择 File | New | Apex Class.
  2. 对于类名称,输入AwesomeCalculator,然后单击 OK.
  3. 用下面的类定义替换自动生成的代码。
    public class AwesomeCalculator {
        public static Double add(Double x, Double y) {
            calculatorServices.CalculatorImplPort calculator = 
                new calculatorServices.CalculatorImplPort();
            return calculator.doAdd(x,y);
        }
    }
  4. 按下CTRL + S保存。

    在测试过程中创建您的模拟实现来伪造标注。您的WebServiceMock实现调用doInvoke方法,该方法返回您为测试指定的响应。这些代码大部分是样板。这个练习中最难的部分就是搞清楚Web服务如何返回一个响应,这样你就可以伪造一个值。

  5. 在开发者控制台中,选择 File | New | Apex Class.
  6. 对于类名称,输入CalculatorCalloutMock,然后单击 OK.
  7. 将自动生成的代码替换为以下类定义。
    @isTest
    global class CalculatorCalloutMock implements WebServiceMock {
       global void doInvoke(
               Object stub,
               Object request,
               Map<String, Object> response,
               String endpoint,
               String soapAction,
               String requestName,
               String responseNS,
               String responseName,
               String responseType) {
            // 开始 - 指定你想发送的响应
            calculatorServices.doAddResponse response_x = 
                new calculatorServices.doAddResponse();
            response_x.return_x = 3.0;
            // 结束
            response.put('response_x', response_x); 
       }
    }
  8. 按下CTRL + S保存。

    最后,您的测试方法需要通过调用Test.setMock来指示Apex运行时发送假响应,然后在AwesomeCalculator类中进行标注。像任何其他测试方法一样,我们断言我们的模拟响应得到了正确的结果。

  9. 在开发者控制台中,选择 File | New | Apex Class.
  10. 对于类名称,输入AwesomeCalculatorTest,然后单击 OK.
  11. 将自动生成的代码替换为以下类定义。
    @isTest
    private class AwesomeCalculatorTest {
        @isTest static void testCallout() {              
            // 这将导致生成一个假的响应
            Test.setMock(WebServiceMock.class, new CalculatorCalloutMock());
            // 调用调用标注的方法
            Double x = 1.0;
            Double y = 2.0;
            Double result = AwesomeCalculator.add(x, y);
            // 验证是否返回假结果
            System.assertEquals(3.0, result); 
        }
    }
  12. 按下CTRL + S保存。
  13. 要运行测试,请选择 Test | Run All.

AwesomeCalculator类现在应该显示100%的代码覆盖率!

你可能也会喜欢...