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

Posted zero.zhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了salesforce 零基础学习(三十三)通过REST方式访问外部数据以及JAVA通过rest方式访问salesforce相关的知识,希望对你有一定的参考价值。

本篇参考Trail教程:

https://developer.salesforce.com/trailhead/force_com_dev_intermediate/apex_integration_services/apex_integration_rest_callouts

有的时候我们需要在salesforce中引入外部的方法或者数据,这样就需要访问外部的Services,目前常用的访问方式有两种:

1.SOAP方式:Web Service通过XML方式调用SOAP Web服务器;

2.REST方式:Http通过JSON使用REST方式调用服务器。

 这两种Callouts使用原理类似,简单的可以理解像服务器发送一个请求,然后服务器返回一个响应。基于WSDL的callouts适用于SOAP方式,HTTP方式可以使用任何的HTTP service,SOAP或者REST都可以。

这两种方式能选择Http方式尽量选择Http方式。

下面来了解一下REST方式获取外部Service数据以及其他Service访问Salesforce数据操作。

一.REST方式获取外部Service数据

REST方式主要原理如下图所示。使用REST方式主要步骤如下:

 

salesforce通过REST方式访问外界站点步骤如下:

1.将Web Service的授权端点地址添加到Remote Site中:setup->Administer->Security Site Settings->Remote Site Settings。

salesforce提供了两个测试URL,将两个测试的URL添加到Remote Site中。两个URL分别为:

http:https://ap2.salesforce.com/0rp28000000TSqv

soap:https://ap2.salesforce.com/0rp28000000TSr0

2.代码进行访问

通过HTTP方式可以使用以下方法进行相关操作的访问

https://th-apex-http-callout.herokuapp.com/animals远程站点JSON内容如下{"animals":["majestic badger","fluffy bunny","scary bear","chicken"]}

在Eclipse中使用匿名块编写代码实现访问:window->show view->Other->Execute Anonymous即可打开匿名块。

GET方式获取数据:

Http http = new Http();
HttpRequest request = new HttpRequest();
request.setEndpoint(\'https://th-apex-http-callout.herokuapp.com/animals\');
request.setMethod(\'GET\');
HttpResponse response = http.send(request);
// If the request is successful, parse the JSON response.
if (response.getStatusCode() == 200) {
    // Deserialize the JSON string into collections of primitive data types.
    Map<String, Object> results = (Map<String, Object>) JSON.deserializeUntyped(response.getBody());
    // Cast the values in the \'animals\' key as a list
    List<Object> animals = (List<Object>) results.get(\'animals\');
    System.debug(\'Received the following animals:\');
    for (Object animal: animals) {
        System.debug(animal);
    }
}

输出的结果如下:

其他方式自行测试。

二.Salesforce作为REST Service供java访问(可以供其它语言访问,这里只对java展示,因为我只会java)

 有的时候我们需要在其他平台上获取sfdc端的数据,比如做android项目需要访问sfdc数据,那样就需要Salesforce作为Service,java端通过http获取并对数据进行相关操作。步骤如下:

1)新建一个App,然后创建Connected App:

setup->Build->Create->Apps.先new一个app,正常new完以后new一个Connected App,设置Enable OAuth Settings为true,截图如下所示:

java访问sfdc 的Service的时候需要用到Consumer Key以及Consumer Secret这两项。

2)sfdc端rest service构建:这里我们以Goods__c进行操作,主要方法有添加一条Goods,通过Id获取Goods,通过PageNumber获取指定条数开始的Goods数据,修改一条Goods以及删除一条Goods。

这里对常用的注解进行解释:

  1.@RestResource:曝光此类作为REST资源;

  2.@HttpGet:曝光方法作为REST资源,当有Http get请求发送时,此注解对应的方法会被执行;

  3.@HttpPost:Http post 请求发送时,此注解对应的方法会被执行;

  4.@HttpDelete:当有Http delete请求发送时,此注解对应的方法会被执行;

  5.@HttpPut:当有Http put请求发送时,此注解对应的方法会被执行;

  6.@HttpPatch:当有Http patch请求发送时,此注解对应的方法会被执行。

因为http有请求时按照请求方式来对应相关方法,所以一个类中上述标签只能存在一个,即不能存在两个方法标注@HttpRequest等。

 1 /*
 2 * 使用salesforce通过REST方式作为webservice,需要以下几点:
 3 * 1.类和方法需要global,方法需要静态
 4 * 2.类需要通过RestResource(UrlMapping=\'/page/*\')注解声明
 5 * 3.@HttpGet和@HttpDelete不能有形参,可以通过URL?param或者URL/param方式传过来参数
 6 */
 7 @RestResource(UrlMapping=\'/Goods/*\')
 8 global class GoodsRESTController {
 9     global static final Integer PAGE_SIZE = 20;
10     @HttpGet
11     global static List<Goods__c> getGoodsByIdOrGoodsList() {
12         RestRequest request = RestContext.request;
13         // grab the goodsId from the end of the URL
14         String currentPage = request.params.get(\'currentPage\') != null ? request.params.get(\'currentPage\') : \'0\';
15         Integer offsetNumber = Integer.valueOf(currentPage) * PAGE_SIZE;
16         String goodsId = request.params.get(\'goodsId\');
17         String fetchSql;
18         if(goodsId != null) {
19             fetchSql = \'SELECT CreatedById, CreatedDate, IsDeleted, Name,\' +
20             \' GoodsBrand__c, GoodsCostPrice__c, GoodsDescribe__c, GoodsName__c,\' +
21             \' GoodsPrice__c, GoodsProfit__c, LastActivityDate, LastModifiedById,\' +
22             \' LastModifiedDate, No__c, OwnerId, Id FROM Goods__c\' +
23             \' where Id = :goodsId\';
24         } else {
25             fetchSql = \'SELECT CreatedById, CreatedDate, IsDeleted, Name,\' +
26             \' GoodsBrand__c, GoodsCostPrice__c, GoodsDescribe__c, GoodsName__c,\' +
27             \' GoodsPrice__c, GoodsProfit__c, LastActivityDate, LastModifiedById,\' +
28             \' LastModifiedDate, No__c, OwnerId, Id FROM Goods__c limit :PAGE_SIZE offset :offsetNumber\';
29         }
30         List<Goods__c> goodsList = Database.query(fetchSql);
31         return goodsList;
32     }
33     
34     
35     @HttpPost
36     global static Id insertGoods(String goodsName,String goodsBrand,String goodsPrice,String goodsCostPrice,String goodsDescribe) {
37         System.debug(\'---------goodsName-------------\' + goodsName);
38         Goods__c goods = new Goods__c();
39         if(goodsPrice != null && goodsPrice.isNumeric()) {
40             goods.GoodsPrice__c = Double.valueOf(goodsPrice);
41         }
42         if(goodsCostPrice != null && goodsCostPrice.isNumeric()) {
43             goods.GoodsCostPrice__c = Double.valueOf(goodsCostPrice);
44         }
45         goods.GoodsName__c = goodsName;
46         goods.GoodsDescribe__c = goodsDescribe;
47         insert goods;
48         return goods.Id;
49     }
50     
51     @HttpDelete
52     global static void deleteGoods() {
53         RestRequest request = RestContext.request;
54         String goodsId = request.requestURI.substring(
55             request.requestURI.lastIndexOf(\'/\')+1);
56         Goods__c needDeleteGoods = [select Id from Goods__c where Id = :goodsId];
57         if(needDeleteGoods != null) {
58             delete needDeleteGoods;
59         }
60     }
61     
62     @HttpPut
63     global static ID upsertGoods(String id,String goodsName,String goodsBrand,String goodsPrice,String goodsCostPrice,String goodsDescribe) {
64         Goods__c goods = new Goods__c();
65         goods.Id = id;
66         goods.GoodsName__c = goodsName;
67         goods.GoodsBrand__c = goodsBrand;
68         goods.GoodsDescribe__c = goodsDescribe;
69         if(goodsPrice != null && goodsPrice.isNumeric()) {
70             goods.GoodsPrice__c = Double.valueOf(goodsPrice);
71         }
72         if(goodsCostPrice != null && goodsCostPrice.isNumeric()) {
73             goods.GoodsCostPrice__c = Double.valueOf(goodsCostPrice);
74         }
75         upsert goods;
76         return goods.Id;
77     }
78 
79     @HttpPatch
80     global static ID updateGoods() {
81         RestRequest request = RestContext.request;
82         String goodsId = request.requestURI.substring(
83             request.requestURI.lastIndexOf(\'/\')+1);
84         Goods__c goods = [select Id from Goods__c where Id= :goodsId];
85         // Deserialize the JSON string into name-value pairs
86         Map<String, Object> params = (Map<String, Object>)JSON.deserializeUntyped(request.requestbody.tostring());
87         // Iterate through each parameter field and value
88         goods.GoodsName__c = String.valueOf(params.get(\'GoodsName__c\'));
89         goods.GoodsPrice__c = Double.valueOf(params.get(\'GoodsPrice__c\'));
90         goods.GoodsCostPrice__c = Double.valueOf(params.get(\'GoodsCostPrice__c\'));
91         update goods;
92         return goods.Id;
93     } 
94     
95     
96     
97 }

测试自己写的方法可以在workbench中查看,使用salesforce账号登录workbench,https://workbench.developerforce.com/login.php.在这里可以测试一下getGoodsByIdOrGoodsList方法,想要测试其他方法可以参看最上面的链接自行测试。如下图所示:

 

3)java端访问sfdc的REST Service

java端访问sfdc的REST Service之前需要做两部分,第一部分是下载Http client的jar包,第二部分是下载json的jar包

1.Http client jar包下载:访问http://hc.apache.org/downloads.cgi 选择最新的jar包进行下载,下载后解压,在lib目录下位所需要的http client的jar包。

2.下载json的jar包:http://mvnrepository.com/artifact/org.json/json。可以选择下载最新的json下载后将json的jar和http client的jar放在一个文件夹下,比如我们现在放在桌面的jars文件夹下。

接下来打开eclipse,jars目录下的jar包全都放在java项目里,然后开始代码访问阶段。

  1  
  2 import java.io.IOException;
  3 import java.util.ArrayList;
  4 import java.util.List;
  5 import org.apache.http.Header;
  6 import org.apache.http.HttpResponse;
  7 import org.apache.http.HttpStatus;
  8 import org.apache.http.client.ClientProtocolException;
  9 import org.apache.http.client.HttpClient;
 10 import org.apache.http.client.methods.HttpDelete;
 11 import org.apache.http.client.methods.HttpGet;
 12 import org.apache.http.client.methods.HttpPost;
 13 import org.apache.http.entity.StringEntity;
 14 import org.apache.http.impl.client.HttpClientBuilder;
 15 import org.apache.http.message.BasicHeader;
 16 import org.apache.http.util.EntityUtils;
 17 import org.json.JSONArray;
 18 import org.json.JSONException;
 19 import org.json.JSONObject;
 20 import org.json.JSONTokener;
 21  
 22 public class InvokeGoodsByRestViaSFDC {
 23  
 24     static final String USERNAME     = "你的salesforce账号";
 25     static final String PASSWORD     = "你的salesforce密码+security token(如果有security token)";
 26     static final String LOGINURL     = "https://login.salesforce.com";
 27     static final String GRANTSERVICE = "/services/oauth2/token?grant_type=password";
 28     static final String CLIENTID     = "3MVG9ZL0ppGP5UrBiKUS3jtHfmfz4eBCBEnuY0tIDByXVdtBJWeY6olTn1iLDNvP68EmfVtWE3IDzHOsMuDww";//上图中Consumer Key
 29     static final String CLIENTSECRET = "723866328398987848";//上图中的Consumer Secret
 30     private static String REST_ENDPOINT = "/services/apexrest" ;
 31     private static String baseUri;
 32     private static Header oauthHeader;
 33     private static Header prettyPrintHeader = new BasicHeader("X-PrettyPrint", "1");
 34     
 35     /**
 36      * 判断是否可以访问sfdc
 37      * return:可以访问sfdc的rest则返回true,否则返回false
 38      * */
 39     private static boolean isAccessable() {
 40         HttpClient httpclient = HttpClientBuilder.create().build();
 41          
 42         // Assemble the login request URL
 43         String loginURL = LOGINURL +
 44                           GRANTSERVICE +
 45                           "&client_id=" + CLIENTID +
 46                           "&client_secret=" + CLIENTSECRET +
 47                           "&username=" + USERNAME +
 48                           "&password=" + PASSWORD;
 49  
 50         // Login requests must be POSTs
 51         HttpPost httpPost = new HttpPost(loginURL);
 52         HttpResponse response = null;
 53         try {
 54             // Execute the login POST request
 55             response = httpclient.execute(httpPost);
 56         } catch (ClientProtocolException cpException) {
 57             cpException.printStackTrace();
 58         } catch (IOException ioException) {
 59             ioException.printStackTrace();
 60         }
 61         // verify response is HTTP OK
 62         final int statusCode = response.getStatusLine().getStatusCode();
 63         if (statusCode != HttpStatus.SC_OK) {
 64             System.out.println("Error authenticating to Force.com: "+statusCode);
 65             return false;
 66         }
 67  
 68         String getResult = null;
 69         try {
 70             getResult = EntityUtils.toString(response.getEntity());
 71         } catch (IOException ioException) {
 72             ioException.printStackTrace();
 73         }
 74  
 75         JSONObject jsonObject = null;
 76         String loginAccessToken = null;
 77         String loginInstanceUrl = null;
 78  
 79         try {
 80             jsonObject = (JSONObject) new JSONTokener(getResult).nextValue();
 81             loginAccessToken = jsonObject.getString("access_token");
 82             loginInstanceUrl = jsonObject.getString("instance_url");
 83         } catch (JSONException jsonException) {
 84             jsonException.printStackTrace();
 85         }
 86  
 87         baseUri = loginInstanceUrl + REST_ENDPOINT + "/Goods";
 88         oauthHeader = new BasicHeader("Authorization", "OAuth " + loginAccessToken) ;
 89         System.out.println("oauthHeader1: " + oauthHeader);
 90         System.out.println(response.getStatusLine());
 91         System.out.println("Successful login");
 92         System.out.println("instance URL: "+loginInstanceUrl);
 93         System.out.println("access token/session ID: "+loginAccessToken);
 94         System.out.println("baseUri: "+ baseUri);        
 95         return true;
 96     }
 97     
 98     
 99     public static void main(String[] args) {
100         createGoods("小米4","小米","2500","2000","测试商品描述信息:小米");
101         //deleteGoods("a052800000880mlAAA");
102         Goods getGoods = getGoodsById("a0528000008811qAAA");
103         if(getGoods != null) {
104             System.out.println("goods Name :" + getGoods.getGoodsName());
105             System.out.println("goods Price : " + getGoods.getGoodsPrice());
106             System.out.println("goods cost price :" +getGoods.getGoodsCostPrice());
107             System.out.println("goods brand : " + getGoods.getGoodsBrand());
108         }
109         List<Goods> goodsList = getGoodsList(0);
110         System.out.println(goodsList.toString());
111         
112         Goods updateGoods = new Goods();
113         updateGoods.setGoodsId("a0528000008811qAAA");
114         updateGoods.setGoodsName("test goods Name");
115         updateGoods.setGoodsPrice("10000");
116         updateGoods.setGoodsCostPrice("8000");
117         updateGoods(updateGoods);
118     }
119     
120     
121     
122     
123     // Create Goods using REST HttpPost
124     public static void createGoods(String goodsName,String goodsBrand,String goodsPrice,String goodsCostPrice,String goodsDescribe) {
125         try {
126             if(isAccessable()) {
127                 String uri = baseUri + "/createGoods";
128                 JSONObject goods = new JSONObject();
129                 goods.put("goodsName", goodsName);
130                 goods.put("goodsBrand", goodsBrand);
131                 goods.put("goodsPrice", goodsPrice);
132                 goods.put("goodsCostPrice",goodsCostPrice);
133                 goods.put("goodsDescribe", goodsDescribe);
134      
135                 System.out.println("JSON for goods record to be inserted:\\n" + goods.toString(1));
136                 //Construct the objects needed for the request
137                 HttpClient httpClient = HttpClientBuilder.create().build();
138                 System.out.println("oauthHeader" + oauthHeader);
139                 HttpPost httpPost = new HttpPost(uri);
140                 httpPost.addHeader(oauthHeader);
141                 httpPost.addHeader(prettyPrintHeader);
142                 httpPost.addHeader("encoding", "UTF-8");
143                 // The message we are going to post
144                 StringEntity body = new StringEntity(goods.toString(1));
145                 body.setContentType("application/json");
146                 httpPost.setEntity(body);
147      
148                 //Make the request
149                 HttpResponse response = httpClient.execute(httpPost);
150                 System.out.print("response : " + response.toString());
151                 //Process the results
152                 int statusCode = response.getStatusLine().getStatusCode();
153                 System.out.println("status code : " + statusCode);
154                 if (statusCode == HttpStatus.SC_OK) {
155                     String response_string = EntityUtils.toString(response.getEntity());
156                     if(response_string != null ) {
157                         System.out.println("New Goods id from response: " + response_string);
158                     }
159                 } else {
160                     System.out.println("Insertion unsuccessful. Status code returned is " + statusCode);
161                 }
162                 httpPost.releaseConnection();
163             }
164         } catch (JSONException e) {
165             System.out.println("Issue creating JSON or processing results");
166             e.printStackTrace();
167         } catch (IOException ioe) {
168             ioe.printStackTrace();
169         } catch (NullPointerException npe) {
170             npe.printStackTrace();
171         }
172     }
173 
174     public static void deleteGoods(String goodsId) {
175         try {
176             if(isAccessable()) {
177                 String uri = baseUri + "/deleteGoods" + "/" + goodsId;
178                 HttpClient httpClient = HttpClientBuilder.create().build();
179                  
180                 HttpDelete httpDelete = new HttpDelete(uri);
181                 httpDelete.addHeader(oauthHeader);
182                 httpDelete.addHeader(prettyPrintHeader);
183      
184                 //Make the request
185                 HttpResponse response = httpClient.execute(httpDelete);
186      
187                 //Process the response
188                 int statusCode = response.getStatusLine().getStatusCode();
189                 if (statusCode == HttpStatus.SC_OK) {
190                     System.out.println("Deleted the goods successfully.");
191                 } else {
192                     System.out.println("goods delete NOT successful. Status code is " + statusCode);
193                 }
194                 httpDelete.releaseConnection();
195             }
196         } catch (JSONException e) {
197             System.out.println("Issue creating JSON or processing results");
198             e.printStackTrace();
199         } catch (IOException ioe) {
200             ioe.printStackTrace();
201         } catch (NullPointerException npe) {
202             npe.printStackTrace();
203         }
204     }
205     
206     public static List<Goods> getGoodsList(Integer pageNumber) {
207         try {
208             if(isAccessable()) {
209                 String uri = baseUri + "/getGoodsByIdOrGoodsList" + "?currentPage=" + pageNumber;
210                 HttpClient httpClient = HttpClientBuilder.create().build(); 
211                 HttpGet httpGet = new HttpGet(uri);
212                 httpGet.addHeader(oauthHeader);
213                 httpGet.addHeader(prettyPrintHeader);
214                 //Make the request
215                 HttpResponse response = httpClient.execute(httpGet);
216                 //Process the response
217                 int statusCode = response.getStatusLine().getStatusCode();
218                 if (statusCode == HttpStatus.SC_OK) {
219                     List<Goods> goodsList = new ArrayList<Goods>();
220                     String response_string = EntityUtils.toString(response.getEntity());
221                     System.out.println("response_string : " + response_string);
222                     JSONArray jsonArray = new JSONArray(response_string);
223                     JSONObject jsonObject = null;
224                     for(int i=0;i<jsonArray.length();i++) {
225                         jsonObject = jsonArray.getJSONObject(i);
226                         Goods goods = new Goods();
227                         if(jsonObject != null) {
228                             goods.setGoodsName(jsonObject.getString("GoodsName__c"));
229                             goods.setGoodsPrice(String.valueOf(jsonObject.getDouble("GoodsPrice__c")));
230                             goods.setGoodsCostPrice(String.valueOf(jsonObject.getDouble("GoodsCostPrice__c")));
231                             goods.setGoodsDescribe(jsonObject.getString("GoodsDescribe__c"));
232                             goodsList.add(goods);
233                         }
234                     }
235                     return goodsList;
236             } else {
237                 return null;
238             }
239             }
240         }catch (JSONException e) {
241             System.out.println("Issue creating JSON or processing results");
242             e.printStackTrace();
243         } catch (IOException ioe) {
244             ioe.printStackTrace();
245         } catch (NullPointerException npe) {
246             npe.printStackTrace();
247         }
248         return null;
249     }
250     
251     public static Goods  getGoodsById(String goodsId) {
252         try {
253             if(isAccessable()) {
254                 String uri = baseUri + "/getGoodsByIdOrGoodsList" + "?goodsId=" + goodsId;
255                 HttpClient httpClient = HttpClientBuilder.create().build();
256                  
257                 HttpGet httpGet = new HttpGet(uri);
258                 httpGet.addHeader(oauthHeader);
259             

以上是关于salesforce 零基础学习(三十三)通过REST方式访问外部数据以及JAVA通过rest方式访问salesforce的主要内容,如果未能解决你的问题,请参考以下文章

salesforce 零基础学习(三十四)动态的Custom Label

salesforce 零基础学习(三十六)通过Process Builder以及Apex代码实现锁定记录( Lock Record)

salesforce 零基础学习(五十三)多个文件生成一个zip文件(使用git上封装的代码)

salesforce 零基础学习(四十三)运算取余

salesforce lightning零基础学习(十三) 自定义Lookup组件(Single & Multiple)

salesforce 零基础学习(二十三)数据记录导出至excel(自定义报表导出)