Salesforce Invoking Http Callouts and Testing Http Callouts

本文参考官方文档和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);
          }
          
      }
      View Code

       

    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;
          }
      }
      View Code

       

    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());
          }
      
      }
      View Code

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

  

posted on 2019-03-08 17:51  Luiken  阅读(271)  评论(0编辑  收藏  举报

导航