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调用外部接口的方法或者数据,常用的访问方式有两种:
- Soap方式:Web Service 通过XML方式调用Soap Web服务器;
- Rest方式:Http通过JSON使用REST方式调用服务器。
下面了解一下REST方式获取外部Service数据。
- Salesforce 通过REST方式获取外部Service数据
REST方式原理图如下:
- Salesforce 通过REST方式访问外界站点步骤如下
- 将Webservice的授权端点地址添加到Remote Site中:set -> Administer->Security Site Settings->Remote Site Settings。
Salesforce提供了两个测试URL。将两个测试的URL添加到Remote Site中。两个URL分别为:
- 代码进行访问,通过Http方式可以使用以下方法进行相关操作的访问:
- 将Webservice的授权端点地址添加到Remote Site中:set -> Administer->Security Site Settings->Remote Site Settings。
- 下面是我自己封装的一个简单的Salesforce调用外部接口的帮助类和测试类:
- 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); } }
- 需要注意的是在测试帮助类的时候,我们必须实现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; } }
- 编写测试类,如:
@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
- Helper类: