前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Salesforce作为REST Service供java访问

Salesforce作为REST Service供java访问

作者头像
故久
发布2019-09-29 14:49:42
6560
发布2019-09-29 14:49:42
举报
文章被收录于专栏:故久

有的时候我们需要在其他平台上获取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这两项。

注意:允许用户要选择管理员批准的用户为预先授权以及选择解除IP限制。

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等。

/* * 使用salesforce通过REST方式作为webservice,需要以下几点: * 1.类和方法需要global,方法需要静态 * 2.类需要通过RestResource(UrlMapping='/page/*')注解声明 * 3.@HttpGet和@HttpDelete不能有形参,可以通过URL?param或者URL/param方式传过来参数 */ @RestResource(UrlMapping='/Goods/*') global class GoodsRESTController { global static final Integer PAGE_SIZE = 20; @HttpGet global static List<Goods__c> getGoodsByIdOrGoodsList() { RestRequest request = RestContext.request; // grab the goodsId from the end of the URL String currentPage = request.params.get('currentPage') != null ? request.params.get('currentPage') : '0'; Integer offsetNumber = Integer.valueOf(currentPage) * PAGE_SIZE; String goodsId = request.params.get('goodsId'); String fetchSql; if(goodsId != null) { fetchSql = 'SELECT CreatedById, CreatedDate, IsDeleted, Name,' + ' GoodsBrand__c, GoodsCostPrice__c, GoodsDescribe__c, GoodsName__c,' + ' GoodsPrice__c, GoodsProfit__c, LastActivityDate, LastModifiedById,' + ' LastModifiedDate, No__c, OwnerId, Id FROM Goods__c' + ' where Id = :goodsId'; } else { fetchSql = 'SELECT CreatedById, CreatedDate, IsDeleted, Name,' + ' GoodsBrand__c, GoodsCostPrice__c, GoodsDescribe__c, GoodsName__c,' + ' GoodsPrice__c, GoodsProfit__c, LastActivityDate, LastModifiedById,' + ' LastModifiedDate, No__c, OwnerId, Id FROM Goods__c limit :PAGE_SIZE offset :offsetNumber'; } List<Goods__c> goodsList = Database.query(fetchSql); return goodsList; } @HttpPost global static Id insertGoods(String goodsName,String goodsBrand,String goodsPrice,String goodsCostPrice,String goodsDescribe) { System.debug('---------goodsName-------------' + goodsName); Goods__c goods = new Goods__c(); if(goodsPrice != null && goodsPrice.isNumeric()) { goods.GoodsPrice__c = Double.valueOf(goodsPrice); } if(goodsCostPrice != null && goodsCostPrice.isNumeric()) { goods.GoodsCostPrice__c = Double.valueOf(goodsCostPrice); } goods.GoodsName__c = goodsName; goods.GoodsDescribe__c = goodsDescribe; insert goods; return goods.Id; } @HttpDelete global static void deleteGoods() { RestRequest request = RestContext.request; String goodsId = request.requestURI.substring( request.requestURI.lastIndexOf('/')+1); Goods__c needDeleteGoods = [select Id from Goods__c where Id = :goodsId]; if(needDeleteGoods != null) { delete needDeleteGoods; } } @HttpPut global static ID upsertGoods(String id,String goodsName,String goodsBrand,String goodsPrice,String goodsCostPrice,String goodsDescribe) { Goods__c goods = new Goods__c(); goods.Id = id; goods.GoodsName__c = goodsName; goods.GoodsBrand__c = goodsBrand; goods.GoodsDescribe__c = goodsDescribe; if(goodsPrice != null && goodsPrice.isNumeric()) { goods.GoodsPrice__c = Double.valueOf(goodsPrice); } if(goodsCostPrice != null && goodsCostPrice.isNumeric()) { goods.GoodsCostPrice__c = Double.valueOf(goodsCostPrice); } upsert goods; return goods.Id; }

@HttpPatch global static ID updateGoods() { RestRequest request = RestContext.request; String goodsId = request.requestURI.substring( request.requestURI.lastIndexOf('/')+1); Goods__c goods = [select Id from Goods__c where Id= :goodsId]; // Deserialize the JSON string into name-value pairs Map<String, Object> params = (Map<String, Object>)JSON.deserializeUntyped(request.requestbody.tostring()); // Iterate through each parameter field and value goods.GoodsName__c = String.valueOf(params.get('GoodsName__c')); goods.GoodsPrice__c = Double.valueOf(params.get('GoodsPrice__c')); goods.GoodsCostPrice__c = Double.valueOf(params.get('GoodsCostPrice__c')); update goods; return goods.Id; } }

测试自己写的方法可以在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项目里,然后开始代码访问阶段。

import java.io.IOException; import java.util.ArrayList; import java.util.List;

import org.apache.http.Header; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.message.BasicHeader; import org.apache.http.util.EntityUtils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONTokener;

public class InvokeGoodsByRestViaSFDC { static final String USERNAME = "你的salesforce账号"; static final String PASSWORD = "你的登录密码以及安全标识"; static final String LOGINURL = "https://login.salesforce.com"; static final String GRANTSERVICE = "/services/oauth2/token?grant_type=password"; static final String CLIENTID = "3MVG9pe2TCoA1Pf5QIj3FcPC_7ykIKqrJaxcbP4PEzsHw0UHAqhsVzxo4XPD1zqxTLmpJaCcfwp_TqE3IYjAG"; static final String CLIENTSECRET = "05C0211E8A72E2F5ED8C5CD83952FC716141B692A4246529FC38C38731021E7E";//上图中的Consumer Secret private static String REST_ENDPOINT = "/services/apexrest" ; private static String baseUri; private static Header oauthHeader; private static Header prettyPrintHeader = new BasicHeader("X-PrettyPrint", "1"); private static boolean isAccessable() { HttpClient httpclient = HttpClientBuilder.create().build(); String loginURL = LOGINURL + GRANTSERVICE + "&client_id=" + CLIENTID + "&client_secret=" + CLIENTSECRET + "&username=" + USERNAME + "&password=" + PASSWORD; HttpPost httpPost = new HttpPost(loginURL); System.out.println(loginURL); HttpResponse response = null; try { response = httpclient.execute(httpPost); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } final int statusCode = response.getStatusLine().getStatusCode(); if (statusCode != HttpStatus.SC_OK) { System.out.println("Error authenticating to Force.com: "+statusCode); return false; } String getResult = null; try { getResult = EntityUtils.toString(response.getEntity()); } catch (IOException ioException) { // TODO Auto-generated catch block ioException.printStackTrace(); } JSONObject jsonObject = null; String loginAccessToken = null; String loginInstanceUrl = null; try { jsonObject = (JSONObject) new JSONTokener(getResult).nextValue(); loginAccessToken = jsonObject.getString("access_token"); loginInstanceUrl = jsonObject.getString("instance_url"); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } baseUri = loginInstanceUrl + REST_ENDPOINT + "/account"; oauthHeader = new BasicHeader("Authorization", "OAuth " + loginAccessToken) ; System.out.println("oauthHeader1: " + oauthHeader); System.out.println(response.getStatusLine()); System.out.println("Successful login"); System.out.println("instance URL: "+loginInstanceUrl); System.out.println("access token/session ID: "+loginAccessToken); System.out.println("baseUri: "+ baseUri); return true; } public static void main(String[] args) { //InvokeGoodsByRestViaSFDC.createGoods("百度"); // InvokeGoodsByRestViaSFDC.deleteAccount("yipan"); //Account account=new Account(); //account.setId("0010o00002Hdpsl"); //account.setName("百度"); //InvokeGoodsByRestViaSFDC.updateAccount(account); InvokeGoodsByRestViaSFDC. getAccountList(); }

public static void createGoods(String accountName) { try { if(isAccessable()) { String uri = baseUri + "/insertGoods"; System.out.println(uri); JSONObject account = new JSONObject(); account.put("accountName", accountName); System.out.println("JSON for account record to be insert:\n" + account.toString()); HttpClient httpClient = HttpClientBuilder.create().build(); System.out.println("oauthHeader" + oauthHeader); HttpPost httpPost = new HttpPost(uri); httpPost.addHeader(oauthHeader); httpPost.addHeader(prettyPrintHeader); httpPost.addHeader("encoding", "UTF-8"); StringEntity body = new StringEntity(account.toString(1),"UTF-8"); body.setContentType("application/json"); httpPost.setEntity(body); HttpResponse response = httpClient.execute(httpPost); System.out.print("response : " + response.toString()); int statusCode = response.getStatusLine().getStatusCode(); System.out.println("status code : " + statusCode); if (statusCode == HttpStatus.SC_OK) { String response_string = EntityUtils.toString(response.getEntity()); if(response_string != null ) { System.out.println("New Account id from response: " + response_string); } } else { System.out.println("Insertion unsuccessful. Status code returned is " + statusCode); } httpPost.releaseConnection(); } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NullPointerException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static List<Account> getAccountList() { if (isAccessable()) { String uri = baseUri + "/getGoodsByIdOrGoodsList"; System.out.println(uri); HttpClient client = HttpClientBuilder.create().build(); HttpGet get = new HttpGet(uri); get.setHeader(oauthHeader); get.setHeader(prettyPrintHeader);

try { HttpResponse response = client.execute(get); int statusCode = response.getStatusLine().getStatusCode(); if (statusCode == HttpStatus.SC_OK) { List<Account> accountlist = new ArrayList<Account>(); String response_string = EntityUtils.toString(response.getEntity()); System.out.println("response_string:" + response_string); JSONArray jsonArray = new JSONArray(response_string); JSONObject jsonObject = null; for (int i = 0; i < jsonArray.length(); i++) { jsonObject = jsonArray.getJSONObject(i); Account account = new Account(); if (jsonObject != null) { account.setName(jsonObject.get("Name")); } accountlist.add(account); } get.releaseConnection(); return accountlist; } else { get.releaseConnection(); return null; } } catch (JSONException e) { System.out.println("Issue creating JSON or processing results"); e.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } catch (NullPointerException npe) { npe.printStackTrace(); } } return null;

} public static void deleteAccount(String accountName) { if (isAccessable()) { HttpClient client = HttpClientBuilder.create().build(); String url = baseUri + "/deleteGoods/" + accountName; HttpDelete delete = new HttpDelete(url); delete.addHeader(oauthHeader); delete.addHeader(prettyPrintHeader); HttpResponse response = null; try { response = client.execute(delete); int statusCode = response.getStatusLine().getStatusCode(); if (statusCode == HttpStatus.SC_OK) { System.out.println("Deleted the accout successfully."); } else { System.out.println("delete NOT successful. Status code is " + statusCode); } delete.releaseConnection(); } catch (IOException e) { e.printStackTrace(); } } } public static void updateAccount(Account account) { try { if(isAccessable()) { String uri = baseUri + "/updateGoods/"+account.getId(); System.out.println(account.getId()); JSONObject js = new JSONObject(); js.put("Name",account.getName()); System.out.println(account.getName()); org.apache.http.client.methods.HttpPatch httpPatch = new org.apache.http.client.methods.HttpPatch(uri); HttpClient httpClient = HttpClientBuilder.create().build(); httpPatch.addHeader(oauthHeader); httpPatch.addHeader(prettyPrintHeader); StringEntity body = new StringEntity(js.toString(1),"UTF-8"); System.out.println(body); body.setContentType("application/json"); httpPatch.setEntity(body); //Make the request HttpResponse response = httpClient.execute(httpPatch); //Process the response int statusCode = response.getStatusLine().getStatusCode(); if (statusCode == HttpStatus.SC_OK) { System.out.println("Updated the goods successfully."); } else { System.out.println("update NOT successfully. Status code is " + statusCode); } } }catch (JSONException e) { System.out.println("Issue creating JSON or processing results"); e.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } catch (NullPointerException npe) { npe.printStackTrace(); } }

}

测试一下

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档