Salesforce与网络服务的通信

在Salesforce中可以利用Apex类与远程站点的网络服务进行通信。当远程网络服务支持REST方法时,开发者可以利用Apex代码进行数据的操作。

设置远程站点

在设置界面下,搜索“远程站点”,点击“安全性控制”菜单项下的“远程站点设置”链接,即可进入远程站点的一览表。在此处可以新建、编辑、删除远程站点。这些远程站点可以作为网络服务接口。

Apex REST请求

Apex中可以以HttpRequest类为核心和网络服务接口进行REST通信。HttpRequest类包括了“setEndpoint()”、“setMethod()”、“setHeader()”、“setBody()”等函数。

假设有一个网络服务接口“https://example.service.com/laguages”,可以对编程语言的名字进行操作。当执行GET请求时,会给出一个json的结果,包含了一个“languages”数组,里面是若干“language”对象。

GET请求

用以下代码可以实现GET请求:

public class LanguageCallouts {
public static HttpResponse makeGetCallout() {
Http http = new Http(); HttpRequest request = new HttpRequest();
// 设置网络服务接口的地址
request.setEndpoint('https://example.service.com/laguages');
// 设置REST方法
request.setMethod('GET'); // 发送HTTP请求
HttpResponse response = http.send(request); // 检查HTTP通信结果状态代码
if (response.getStatusCode() == 200) {
// 将通信结果转化为Map类型变量
Map<String, Object> results = (Map<String, Object>) JSON.deserializeUntyped(response.getBody()); // 对结果进行处理,得到language对象
List<Object> languages = (List<Object>) results.get('languages');
} return response;
}
}

POST请求

用以下代码可以实现POST请求:

public class LanguageCallouts {
public static HttpResponse makePostCallout() {
Http http = new Http(); HttpRequest request = new HttpRequest(); // 设置网络服务接口的地址
request.setEndpoint('https://example.service.com/laguages');
// 设置REST方法
request.setMethod('POST');
// 设置请求的Header,类型为JSON
request.setHeader('Content-Type', 'application/json;charset=UTF-8');
// 将一个JSON对象传入请求的Body,设置编程语言的名字
request.setBody('{"name":"Apex"}'); // 发送HTTP请求
HttpResponse response = http.send(request); // 检查HTTP通信结果状态代码
if (response.getStatusCode() == 201) {
// 在控制台输出通信结果
System.debug(response.getBody());
} return response;
}
}

对API请求进行单元测试

在Apex的单元测试中,如果被测试的函数涉及到对网络服务的请求,则单元测试函数无法真正的连接到网络服务接口进行数据传输。开发者必须建立模拟数据。

Apex中提供了“StaticResourceCalloutMock()”函数和“HttpCalloutMock”接口来对网络服务接口的请求结果进行模拟

StaticResourceCalloutMock()函数

在使用StaticResourceCalloutMock()函数前需要在系统中建立一个静态资源,其中预设了网络服务请求的结果。

比如要测试上面示例代码中的“makeGetCallout()”函数,则首先在系统中建立一个静态资源“mockRequestResult”,其中包含一个JSON格式的字符串:

{"languages": ["C", "PHP", "Java"]}

在单元测试函数中,写入如下代码:

@isTest
static void testGetCallout() {
StaticResourceCalloutMock mock = new StaticResourceCalloutMock(); // 设置静态资源
mock.setStaticResource('mockRequestResult');
// 设置模拟网络服务请求的返回结果
mock.setStatusCode(200);
// 设置模拟网络服务请求的Header部分
mock.setHeader('Content-Type', 'application/json;charset=UTF-8'); // 设置模拟的网络服务请求
Test.setMock(HttpCalloutMock.class, mock); // 运行要测试的函数
HttpResponse result = LanguageCallouts.makeGetCallout(); // 检查返回的结果。该结果应该与mock中设置的内容相同,也包含了静态资源里的内容
System.assertNotEquals(null, result);
System.assertEquals(200, result.getStatusCode());
System.assertEquals('application/json;charset=UTF-8', result.getHeader('Content-Type'));
Map<String, Object> results = (Map<String, Object>) JSON.deserializedUntyped(result.getBody());
List<Object> languages = (List<Object>) results.get('languages');
System.assertEquals(3, languages.size());
}

HttpCalloutMock接口

HttpCalloutMock接口的使用方法与StaticResourceCalloutMock()函数类似,不过不需要先建立静态资源,而需要预先建立一个全局Apex类,该类实现了HttpCalloutMock接口,并预设了网络服务请求的模拟数据。

比如要测试上面示例代码中的“makePostCallout()”函数,则首先在系统中建立一个“LanguagesHttpCalloutMock”类,在其中设置:

@isTest
global class LanguagesHttpCalloutMock implements HttpCalloutMOck {
global HttpResponse response(HttpRequest request) {
HttpResponse response = new HttpResponse();
response.setHeader('Content-Type', 'application/json');
response.setBody('{"languages": ["C", "PHP", "Java", "Apex"]}');
response.setStatusCode(200);
return response;
}
}

在单元测试函数中,写入如下代码:

@isTest
static void testPostCallout() {
// 设置模拟的网络服务请求
Test.setMock(HttpCalloutMock.class, new LanguagesHttpCalloutMock()); // 运行要测试的函数
HttpResponse result = LanguageCallouts.makePostCallout(); // 检查返回的结果
System.assertEquals(200, result.getStatusCode());
System.assertEquals('application/json;charset=UTF-8', result.getHeader('Content-Type'));
String expectedResult = '{"languages": ["C", "PHP", "Java", "Apex"]}';
System.assertEquals(response.getBody(), expectedResult);
}

Apex类作为网络服务

Apex类可以被扩展为网络服务,外部的请求可以通过此类来与Salesforce中的数据进行通信。

将Apex类定义为REST服务类

将Apex类定义为REST服务类只需要以下步骤:

  1. 将类定义为全局类
  2. 将特定注解添加到类和函数的定义

    比如:
@RestResource(urlMapping='/Account/*)
global with sharing class ExampleRestClass {
@HttpGet
global static Account getAccount() {
// ...
}
}

代码讲解:

  1. 在类的定义上方,添加了@RestResource注解,并定义了“urlMapping”属性。这样,该Salesforce中的特定URL便可以作为REST服务的端点。在此示例中,外部请求通过URL “https://xxx.salesforce.com/services/apexrest/Account/” 就可以调用此类。需要注意的是,“urlMapping”属性是区分大小写的。
  2. 在函数的上方,添加了@HttpGet注解,说明此类相应“GET”方法。同样,基于标准的REST方法,还有其他注解:@HttpPost, @HttpDelete, @HttpPut, @HttpPatch等。

将Apex类定义为SOAP服务类

将Apex类定义为SOAP服务类和定义为REST服务类的步骤类似,只不过不需要注解,而是直接用“webservice”关键字定义函数。比如:

global with sharing class ExampleSoapClass {
webservice static Account getAccount(String Id) {
// ...
}
}

从设置界面的“Apex 类”链接进入Apex类一览表,再进入该类的详细信息页面,即可下载该类对应的WSDL文件,用于SOAP请求。

Apex API 请求的更多相关文章

  1. 在Android中,使用Kotlin的 API请求简易方法

    原文标题:API request in Android the easy way using Kotlin 原文链接:http://antonioleiva.com/api-request-kotli ...

  2. vue项目实践-添加axios封装api请求

    安装 axios npm install axios --save 创建实例 (utils/fetch.js) axios 默认提交格式为:application/json 可使用 qs 模块(需要安 ...

  3. laravel5.7 前后端分离开发 实现基于API请求的token认证

    最近在学习前后端分离开发,发现 在laravel中实现前后台分离是无法无法使用 CSRF Token 认证的.因为 web 请求的用户认证是通过Session和客户端Cookie的实现的,而前后端分离 ...

  4. 微信小程序开发——使用mock数据模拟api请求

    前言: 微信小程序开发中,后端提供了接口设计文档,前端可以先mock数据模拟api请求进行开发调试,而且可以根据需要设计mock文件的格式和内容,这样在后端接口开发完成之前,前端可以最大限度的完成前端 ...

  5. [Postman]排除API请求(9)

    可能存在API无法运行或出现意外行为的情况.如果您没有收到任何回复,邮递员将显示有关连接服务器时出错的消息. 有关错误可能原因的更多详细信息,请打开Postman Console.它有关于故障的详细信 ...

  6. Android开发 - Retrofit 2 使用自签名的HTTPS证书进行API请求

    为了确保数据传输的安全,现在越来越多的应用使用Https的方式来进行数据传输,使用https有很多有点,比如: HTTPS协议是由SSL+HTTP协议构建的可进行加密传输.身份认证的网络协议,要比ht ...

  7. 解决React Native使用Fetch API请求网络报Network request failed

    问题来源: 1 . 在测试fetch数据请求时,Xcode9.0以上的无法请求https, 需要在Xcode中加载项目后修改Info.plist的相关配置,具体如下参考 问题及解决方法一模一样,不再重 ...

  8. android Observable api请求参数设置注解问题

    android Observable api请求参数设置注解问题 2018-10-29 20:05:24.919 11786-11786/xxx E/wxh: getQuote=USD getBase ...

  9. openstack身份认证与API请求流程

    一.概况 1. 请求认证token时,需发送的认证信息包括: 2. 如果认证成功,会获得认证token 3. 在发送的API请求中将认证token填入X-Auth-Token字段.可以一直使用这个认证 ...

随机推荐

  1. spring cloud hystrix dashboard 没有/actuator/hystrix.stream路径解决

    首先我用的是spring boot Greenwich.SR2 在测试hystrix-dashboard监控服务时,发现访问localhost:9001/actuator/hystrix.stream ...

  2. 【Java语言特性学习之三】Java4种对象引用

    为了更灵活的控制对象的生命周期,在JDK1.2之后,引用被划分为(引用的级别和强度由高到低)强引用.软引用.弱引用.虚引用四种类型,每种类型有不同的生命周期,它们不同的地方就在于垃圾回收器对待它们会使 ...

  3. Comment file

    /// This is the head comment of a file. /*********************************************************** ...

  4. 生成 RSA 公钥和私钥的方法

    在使用 RSA 加密算法时,需要使用到一对 公钥 和 私钥,生成 公钥 和 私钥 需要借助 openssl 这款工具,下载这款工具的地址如下: http://slproweb.com/products ...

  5. IDEA帮助文档快捷键ctrl+q 查看类 方法 变量 帮助文档 注释 快捷键

    IDEA查看类 成员变量  局部变量注释快捷键,Ctrl +Q 查看帮助文档 实际项目中,通常一个类中的代码都不少,而且有很多的变量 那么如何快速知道这个变量的一些信息,比如类型,定义? 比如在第50 ...

  6. Enum.GetUnderlyingType(obj.GetType())

    Enum.GetUnderlyingType(obj.GetType())获取保存枚举值的数据类型:

  7. Javaweb常用解决问题连接

    1.javaweb的idea如何创建及配置web项目 https://www.jianshu.com/p/8d49d36a3c7e 2.servlet的建立以及部署 https://blog.csdn ...

  8. MySQL基础(四)(子查询与链接)

    1.子查询简介 其中,所谓的“外层查询”并不是指“查找”,指的是所有SQL语句的统称:结构化查询语言(Structured Query Language),简称SQL. : 2.由比较运算符引发的子查 ...

  9. 学习shiro第一天

    shiro是一个强大而且易用的安全框架(主要包括认证和授权),它比spring security更加简单,而且它不依赖于任何容器,可以和许多框架集成. shiro的核心是安全管理器(SecurityM ...

  10. 8 Best DDoS Attack Tools (Free DDoS Tool Of The Year 2019)

    #1) HULK Description: HULK stands for HTTP Unbearable Load King. It is a DoS attack tool for the web ...