本文参考官方文档和zero zhang的博客:

  https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_integration_intro.htm

Salesforce调用外部接口的方法或者数据,常用的访问方式有两种:

  1. Soap方式:Web Service 通过XML方式调用Soap Web服务器;
  2. Rest方式:Http通过JSON使用REST方式调用服务器。

下面了解一下REST方式获取外部Service数据。

  • Salesforce 通过REST方式获取外部Service数据

      REST方式原理图如下:

  • Salesforce 通过REST方式访问外界站点步骤如下
    1. 将Webservice的授权端点地址添加到Remote Site中:set -> Administer->Security Site Settings->Remote Site Settings。
      Salesforce提供了两个测试URL。将两个测试的URL添加到Remote Site中。两个URL分别为:

    2. 代码进行访问,通过Http方式可以使用以下方法进行相关操作的访问:

  • 下面是我自己封装的一个简单的Salesforce调用外部接口的帮助类和测试类:
    1. Helper类:

      global class HttpHelper {
      
          private Http Http{get;set;}
      
          private HttpRequest Request{get;set;}
      
          private HttpResponse Response{get;set;}
      
          public HttpResponse service(String method,String url,String body,String contentType,String authoriziton,String certificateName){
      Http = new Http();
      Request = new HttpRequest();
      try{
      Request.setMethod(method);
      Request.setEndpoint(url);
      Request.setTimeout(120000);
      if(string.isEmpty(contentType) || string.isBlank(contentType)){
      Request.setHeader('Content-Type','application/json;charset=utf-8');
      }else{
      Request.setHeader('Content-Type',contentType);
      }
      if(string.isNotEmpty(authoriziton)&&string.isNotBlank(authoriziton)){
      Request.setHeader('Authorization', authoriziton);
      }
      if(string.isNotEmpty(certificateName)&&string.isNotBlank(certificateName)){
      Request.setClientCertificateName(certificateName);
      }
      if(string.isNotEmpty(body)&&string.isNotBlank(body)){
      Request.setBody(body);
      }
      Response = Http.send(Request);
      System.debug('Response:'+Response);
      }catch(Exception e){
      system.debug('RequstException:'+e);
      }
      return Response;
      } /**
      Execute the Get Method
      */
      public HttpResponse doGet(String url,String body,String authoriziton,String certificateName){
      return service('GET', url, body, null, authoriziton,certificateName);
      } /**
      * Execute the Post Method
      */
      public HttpResponse doPost(String url,String body,String authoriziton,String certificateName){
      return service('POST', url, body, null, authoriziton,certificateName);
      } }
    2. 需要注意的是在测试帮助类的时候,我们必须实现HttpCalloutMock的这个类并实现其方法respond(),如:
      @isTest global class HttpCallOutMockImpl implements HttpCalloutMock{
      global HttpResponse respond(HttpRequest request){
      //Optionally,only send a mock response for a specific endpoint.
      System.assertEquals('http://example.com/example/test',request.getEndpoint());
      System.assertEquals('GET',request.getMethod()); //Create a fake response
      HttpResponse response = new HttpResponse();
      response.setHeader('Content-Type', 'application/json');
      response.setBody('{"example":"test"}');
      response.setStatusCode(200);
      return response;
      }
      }
    3. 编写测试类,如:
      @isTest
      private class HttpHelperTest {
      @isTest static void testCallOut(){
      Test.setMock(HttpCalloutMock.class,new HttpCallOutMockImpl());
      HttpHelper httpHelper = new HttpHelper();
      HttpResponse resp= httpHelper.doGet('http://example.com/example/test', null, null, null);
      string contentType = resp.getHeader('Content-Type');
      System.assert(contentType == 'application/json');
      String actualValue = resp.getBody();
      System.debug('Body:'+actualValue);
      String expectedValue = '{"example":"test"}';
      System.assertEquals(actualValue, expectedValue);
      System.assertEquals(200, resp.getStatusCode());
      } }

      注:测试类必须加上标记@IsTest 

  

Salesforce Invoking Http Callouts and Testing Http Callouts的更多相关文章

  1. [PWA] Disable Text Selection and Touch Callouts in a PWA on iOS

    Because an installed PWA is really just a web app running in a browser, there are some browser behav ...

  2. salesforce 零基础学习(三十三)通过REST方式访问外部数据以及JAVA通过rest方式访问salesforce

    本篇参考Trail教程: https://developer.salesforce.com/trailhead/force_com_dev_intermediate/apex_integration_ ...

  3. salesforce 零基础开发入门学习(五)异步进程介绍与数据批处理Batchable

    本篇知识参考:https://developer.salesforce.com/trailhead/force_com_dev_intermediate/asynchronous_apex/async ...

  4. 【转载】salesforce 零基础开发入门学习(五)异步进程介绍与数据批处理Batchable

    salesforce 零基础开发入门学习(五)异步进程介绍与数据批处理Batchable   本篇知识参考:https://developer.salesforce.com/trailhead/for ...

  5. 学习Salesforce | Platform Developer Ⅰ 平台初级开发认证考试指南及备考资源

    一.平台开发人员考试计划 Salesforce平台开发人员初级认证面向具有在Lightning平台上构建自定义应用程序的知识.技能和经验的个人. 该认证考核Lightning平台的基本编程能力,并会使 ...

  6. Salesforce Integration 概览(三) Remote Process Invocation—Fire and Forget(远程进程调用-发后即弃)

    本篇参考:https://resources.docs.salesforce.com/sfdc/pdf/integration_patterns_and_practices.pdf 我们在上一篇讲了远 ...

  7. 四、Salesforce Styles_1

    1.静态变量的使用:<apex:stylesheet value="{!$Resource.TestStyles}"/>2.<apex:page><s ...

  8. Unit Testing a zend-mvc application

    Unit Testing a zend-mvc application A solid unit test suite is essential for ongoing development in ...

  9. [译]36 Days of Web Testing(二)

    Day 7: Http 和 Https Why? 当在网络上传输一些私人,敏感信息时,应该采用加密的手段来保证这些信息在传输的过程中不被侦测到.Https协议正是这种实现机制. Https是一种广泛使 ...

随机推荐

  1. CXF 简单创建Webserver 例子

    最近在弄webserver,因为公司需要用到,来说说,webserver的常用方式吧 1.什么是webservice 1.1   什么是远程调用技术 远程调用数据定义:是系统和系统之间的调用 先说一说 ...

  2. 基于react的MQ管理系统遇到的问题以及解决办法

    跟一般的管理系统差不多 一.需求 1.新增申请和修改的弹窗里面的部门跟应用组改成下拉框,并调取后台接口获取到相应的值.1.1相应的代码 // 获取部门 getDepartment = () => ...

  3. Flutter 卡在 package get 的解决办法

    今天在尝试使用Flutter 的时候,需要使用一个第三方库 修改了 pubspec 文件之后,AS 像往常一样提示 需要 package get. 之前都挺正常,不知道今天怎么了. 一直处在 Runn ...

  4. C# 连蒙带骗不知所以然的搞定USB下位机读写

    公司用了一台发卡机,usb接口,半双工,给了个dll,不支持线程操作,使得UI线程老卡. 懊恼了,想自己直接通过usb读写,各种百度,然后是无数的坑,最终搞定. 现将各种坑和我自己的某些猜想记录一下, ...

  5. 2017-9-10"切题如切菜杯"模拟赛T4 ZZI

    题目 YYH拿到了父亲给的钱欣喜若狂,把这些钱拿来造了n栋房子.现在他要给这些房子通电.他有两种方法:第一种是在房间里搭核电发电机发电,对于不同的房子,他需要花不同的代价Vi:,第二种是将有电的房子i ...

  6. 精进之路之lru

    原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”. 实现1 最常见的实现是 ...

  7. python定时脚本判断服务器内存

    经常我们会发现服务器跑着跑着内存使用率达到了百分之八九十,或者有时候直接挂掉,在我们还没定位是哪块代码有问题导致内存占用很大的时候,可以先写个定时脚本,当服务器内存使用率达到一定值的时候,就重启一起服 ...

  8. CenOS 更换yum源

    说明: 更换CentOS yum源既是修改配置文件/etc/yum.repos.d/CentOS-Base.repo. 目前有很多公司都提供yum源文件的下载,所以我们可以不需要去修改这个文件,直接从 ...

  9. 2017年5月17日20:14:29 rabbitmq 消费 异常信息无法处理 导致轮询

    同事说如果同步的配置的正确的话不会出现这种问题 只有异常的情况下才会,但是 我就真的出现了//TODO 等我有时间的时候再查查看. 如果是异步的出现这种问题的话 包进AmqpRejectAndDont ...

  10. CSS效果:checkbox点选效果

    HTML: <html lang="en"> <head> <meta charset="UTF-8"> <meta ...