Salesforce SOAP 接口集成服务

Salesforce 使用Apex调用外部数据的接口有两种方式:SOAP 和 REST

  • SOAP:Web服务使用XML格式的文件调用服务器,通常需要WSDL文档来生成代码
  • REST:HTTP使用REST格式的文件调用服务器,推荐使用

基于WSDL的CallOut适用于SOAP方式,HTTP方式可以使用任何的HTTP Service,SOAP或者REST都可以,推荐使用REST方式. 在使用SOAP方式调用接口时,可以借助WSDL2Apex工具将XML文件生成Apex类

  1. 在Setup上搜索 Apex Classes
  2. 点击Generate From WSDL
  3. 选择文件parks.xml
  4. 点击Parse WSDL,通过WSDL2Apex工具生成ParkService类和AsyncParkService类
  5. 点击Generate Apex code,确认生产Apex文件
  6. 点击Done

Tips:WSDL解析器很可能因为各种奇怪的原因导致生成文件失败,这时就需要手动调整Apex类或者XML文件,非常的不友好. 正确生成的两个类,一个用于同步调用外部的Web服务(ParkService),一个用于异步调用外部的Web服务(AsyncParkService)

调用外部Web接口的时候,都需要将服务器接口地址添加到远程站点列表进行认证,Setup → Remote Site Settings,添加站点“https://th-apex-soap-service.herokuapp.com”

//Generated by wsdl2apex
public class ParkService {
    public class byCountryResponse {
        public String[] return_x;
        private String[] return_x_type_info = new String[]{‘return‘,‘http://parks.services/‘,null,‘0‘,‘-1‘,‘false‘};
        private String[] apex_schema_type_info = new String[]{‘http://parks.services/‘,‘false‘,‘false‘};
        private String[] field_order_type_info = new String[]{‘return_x‘};
    }
    public class byCountry {
        public String arg0;
        private String[] arg0_type_info = new String[]{‘arg0‘,‘http://parks.services/‘,null,‘0‘,‘1‘,‘false‘};
        private String[] apex_schema_type_info = new String[]{‘http://parks.services/‘,‘false‘,‘false‘};
        private String[] field_order_type_info = new String[]{‘arg0‘};
    }
    public class ParksImplPort {
        public String endpoint_x = ‘https://th-apex-soap-service.herokuapp.com/service/parks‘;
        public Map<String,String> inputHttpHeaders_x;
        public Map<String,String> outputHttpHeaders_x;
        public String clientCertName_x;
        public String clientCert_x;
        public String clientCertPasswd_x;
        public Integer timeout_x;
        private String[] ns_map_type_info = new String[]{‘http://parks.services/‘, ‘ParkService‘};
        public String[] byCountry(String arg0) {
            ParkService.byCountry request_x = new ParkService.byCountry();
            request_x.arg0 = arg0;
            ParkService.byCountryResponse response_x;
            Map<String, ParkService.byCountryResponse> response_map_x = new Map<String, ParkService.byCountryResponse>();
            response_map_x.put(‘response_x‘, response_x);
            WebServiceCallout.invoke(
              this,
              request_x,
              response_map_x,
              new String[]{endpoint_x,
              ‘‘,
              ‘http://parks.services/‘,
              ‘byCountry‘,
              ‘http://parks.services/‘,
              ‘byCountryResponse‘,
              ‘ParkService.byCountryResponse‘}
            );
            response_x = response_map_x.get(‘response_x‘);
            return response_x.return_x;
        }
    }
}

在成功生成Apex类后,即可尝试调用接口查询数据

public class ParkLocator {
    // 测试数据可以是:Germany, India, Japan and United States
    public static String[] country(String country){
        ParkService.ParksImplPort parkImp = new ParkService.ParksImplPort();
        String[] parkList = parkImp.byCountry(country);
        System.debug(‘parkList:‘ + parkList);
        return parkList;
    }
}

和Rest接口一样,普通的测试类不支持Web服务的接口,因此,需要做一些额外工作来进行测试类的编写

新建一个模拟服务器返回数据的类:ParkServiceMock

@isTest
global class ParkServiceMock 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) {
        // 开始 - 指定模拟的服务器返回数据
        ParkService.byCountryResponse response_x = new ParkService.byCountryResponse();
        response_x.return_x = new String[]{‘Yellowstone‘, ‘Mackinac National Park‘, ‘Yosemite‘};
        // 结束 -
        response.put(‘response_x‘, response_x);
   }
}

然后创建测试类:ParkLocatorTest

@isTest
public class ParkLocatorTest {
    @isTest static void testCallout() {
        // 产生模拟的服务器响应数据
        Test.setMock(WebServiceMock.class, new ParkServiceMock());
        // 调用接口方法
        String[] result = ParkLocator.country(‘Japan‘);
    }
}

Salesforce Apex提供了内置的WebServiceMock接口和Test.setMock方法,用以测试方法接收虚假服务器响应,从而提供必要的测试类覆盖范围

参考数据:

https://trailhead.salesforce.com/content/learn/modules/apex_integration_services/apex_integration_soap_callouts

原文地址:https://www.cnblogs.com/mysalesforce/p/12595157.html

时间: 2025-01-15 11:29:23

Salesforce SOAP 接口集成服务的相关文章

Salesforce REST 接口集成服务(二)

在 Salesforce REST 接口集成服务 一文中,主要讲述了如何调用外部服务器的接口,那么该如何开放Salesforce内部接口给外部系统呢? 将Apex类作为Rest Web服务可用非常简单 定义Class 为Global 定义Method为global static 在类和方法上添加注解,比如@HttpGet 类似这样: @RestResource(urlMapping='/Account/*') global with sharing class MyRestResource {

关于 php 调用 其他语言写的Web Service SOAP 接口的参数传递问题

关于 php 调用 其他语言写的Web Service SOAP 接口的参数传递问题,有需要的朋友可以参考下. php调用java写的soap接口经验: 场景一: java是以数组的形式接收参数的,我使用的方法如下: 方法一: require_once ROOT_PATH . '/libraries/nusoap/nusoap.php';//引入nusoap类库文件$client = new nusoap_client("$WSDL_URL",true);$client->dec

spring集成cxf发布restful和soap接口

对于SOAP Webservice和Restful Webservice的选择问题,首先需要理解就是SOAP偏向于面向活动,有严格的规范和标准,包括安全,事务等各个方面的内容,同时SOAP强调操作 方法和操作对象的分离,有WSDL文件规范和XSD文件分别对其定义.而REST强调面向资源,只要我们要操作的对象可以抽象为资源即可以使用REST架 构风格. application-context-cxf.xml <?xml version="1.0" encoding="UT

Problem About Salesforce SOAP API 32.0 In .Net Project

最近在集成项目项目中遇到一个问题:在用最新版本(API 32.0)Enterprise WSDL在.Net 中做集成时,初始化SforceService 时会初始化类错误.这算是Salesforce 在新版本SOAP API 中的一个BUG ,在以前版本没有这个问题,需要大家注意下. 具体错误信息如下: message: Sync Error,System.TypeInitializationException: The type initializer for 'SyncUtility.SFo

Python 接口开发-泛微OA的SOAP接口

一.功能需求 泛微e-cology可以在流程中调用Webservice接口实现与其他系统的联动等复杂功能.但是目前泛微文档中仅提供了调用的方法,但是没有关于接口的相关开发信息. 本次案例是用Python开发一个泛微e-cology 可以调用的Webservice接口. 二.所需要的库 pip install spyne 对于Python3 pip install spyne==2.13.4a1 三.代码实现 from spyne.protocol.soap import Soap11 from

xml字符串和java实体类相互转换JaxbXmlUtil工具类 附java实体类生成soap接口报文案例

JaxbXmlUtil工具类 package com.aiait.ivs.util; import java.io.StringReader; import java.io.StringWriter; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; /** * Jaxb工具类 xml和java类相互转换 * * @author sunj

wget访问SOAP接口

SOAP协议主要是XML交互,所以其访问过程类似于这样: wget --header='Content-Type: text/xml;charset=utf-8' --post-data='<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header> </soapenv:Header> <soapenv:Body>

通过原生的java Http请求soap发布接口

package com.aiait.ivs.util; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.

SOA接口的两种常用实现比较:SOAP vs REST

SOA架构用于异构系统的协作,因此需要一种跨操作系统.跨语言的通用的消息交换格式.SOAP和REST都是基于文本的消息体,相比二进制消息而言具有跨平台的优势,因此被选作SOA接口的常用实现方法.但SOAP和REST又有各自不同的特点和用途. SOAP:将HTTP协议作为传输层协议,本质是采用HTTP进行传输,使用XML封装消息内容的RPC调用. REST:REST并不是一种协议,只是一种设计规范,该设计规范要求程序遵守HTTP协议最初设计的初衷,使用HTTP的GET/PUT/DELTET/POS