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. 大话设计模式Python实现-建造者模式

    建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 下面是一个建造者模式的demo #!/usr/bin/env python # ...

  2. torch_11_风格迁移和cycleGAN

    1,A Neural Algorithm of atistic Style https://axiv.org/pdf/1508.06576.pdf 如何定义图片的内容,风格: 定义内容:在vggnet ...

  3. Theano 报错:No suitable SharedVariable constructor could be found. Are you sure all kwargs are supported? We do not support the parameter dtype or type

    当Theano报错:No suitable SharedVariable constructor could be found. Are you sure all kwargs are support ...

  4. php imagemagick 翻译目录

    图像处理(ImageMagick) 介绍 安装/配置 要求 安装 运行时配置 资源类型 预定义常数 例子 基本用法 Imagick - Imagick课 Imagick :: adaptiveBlur ...

  5. switch的对象不能为null

    我写的NPE 虽然不多, 但几乎每次系统出问题的时候,看到api返回值是空的,绝大多数是NPE造成的. 这时候会感慨一下谁写的bug,然后去补判空代码. 最近抽风,开始给自己写的代码添加UnitTes ...

  6. C# 委托补充01

    上一篇文章写了委托的最基本的一些东西,本篇咱们扯扯委托其他的东西. 示例1插件编程 根据对委托的理解,委托可以把一个方法当作参数进行传递,利用这个特性我们可以使用委托,实现插件编程. public d ...

  7. js 开课

    1.Onclick:点击事件 实例: <p onclick="javascript:alert('hello world');">clickMe</p> 三 ...

  8. 开发技术--Python核心知识A

    开发|Python核心知识A A篇,主要介绍Python基础中列表,元祖,字典,集合,字符串,I/O,条件与循环,异常处理的底层知识与使用的注意事项. 希望大家对于Python会有新的收获,本篇不同于 ...

  9. 【IPHONE开发-OBJECTC入门学习】对象的归档和解归档

    转自:http://blog.csdn.net/java886o/article/details/9046967 #import <Foundation/Foundation.h> #im ...

  10. ERP WIP 部分API应用 详解

    工单创建 (create work order) PROCEDURE new_work_order(p_wip_entity_id NUMBER, p_organization_id NUMBER, ...