文档章节

Salesforce作为REST Service供java访问

故久呵呵
 故久呵呵
发布于 04/16 14:19
字数 1837
阅读 9
收藏 0

有的时候我们需要在其他平台上获取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();
                   }
               }

}

测试一下

 

© 著作权归作者所有

故久呵呵
粉丝 6
博文 58
码字总数 44494
作品 0
衡阳
私信 提问
在Salesforce中创建Web Service供外部系统调用

在Salesforce中可以创建Web Service供外部系统调用,并且可以以SOAP或者REST方式向外提供调用接口,下来的内容将详细讲述一下用SOAP的方式创建Web Service并且用java的程序进行简单的调用。 ...

故久呵呵
06/20
0
0
Teiid 8.10 Final 发布,异构数据存储系统

Teiid 8.10 Final 发布,该版本解决了 113 个 JIRA 问题,包括新特性、增强和 bug 修复,值得关注的有: TEIID-3192 Salesforce Connectivity - connectivity was converted to the partner...

红薯
2015/03/04
1K
2
Spring Cloud微服务之 sleuth+zipkin日志聚合

1.简介 (1)什么是服务追踪 Sleuth 在微服务架构中,要完成一个功能,通过Rest请求服务API调用服务来完成,整个调用过程可能会聚合多个后台服务器协同完成。在整个链路上,任何一处调用超时...

编程SHA
03/25
0
0
【WebService 系列一 WebService概述】

以下部分内容来自于互联网 1、什么是WebService WebService即web服务,它是一种跨编程语言和跨操作系统平台的远程调用技术即跨平台远程调用技术。 采用标准的SOAP(Simple Object Access Pr...

HansonReal
2018/10/08
0
0
REST 风格的 Web 服务入门

要学习本教程,您需要具备以下软件和资源。 软件或资源 要求的版本 NetBeans IDE Java EE 下载包 Java 开发工具包 (JDK) 版本 6 或 7 符合 Java EE 规范的应用服务器 Oracle WebLogic Server...

颜建海
2014/03/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

代码规范

代码格式化 安装vscode插件:Prettier - Code formatter 格式化配置:将下列配置写入到vscode的settings.json文件 (遵照代码格式化) "prettier.disableLanguages": ["vue"], "prettier.......

TreeZhou0511
54分钟前
3
0
python实现人工神经网络的一个例子

人工神经网络已经有无数的开源框架,比如tensorflow,caffe等,可以直接用。但最近需要做一个小样例,把基本思想讲一讲,因此自己写了一个demo,以供参考。 下面直接上代码,代码中有注释,比...

propagator
58分钟前
4
0
远程dubugger

1、在tomcat的bin下/data/project/XXX/apache-tomcat-8.5.23/bin 在catalina.bat文件中新增如下即可 JAVA_OPTS="-Xmx1024m -Xms1024m -agentlib:jdwp=transport=dt_socket,server=y,suspend......

一只小青蛙
今天
1
0
jemter 连接MySQL

jemter 连接MySQL 点击测试计划,测试计划最后”添加目录或jar包到ClassPath“,点击浏览,添加mysql-connector.jar mysql-connector.jar的下载地址: https://mvnrepository.com/artifact/my...

xiaobai1315
今天
5
0
第一次尝试用python实现zabbix主机的批量添加批量删除及模板导入脚本

Python3入门练手尝试篇 API参考: zabbix API 4.0版本:https://www.zabbix.com/documentation/4.0/zh/manual/api #!/bin/python3import xlrd,os,json,requests,sys#参考zabbix API 4.0版本......

平头哥-Enjoystudy
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部