Salesforce中通过SOAP API和Metadata API开发java的web server服务
1。下载Salesforce平台中WSDL文件
在Salesforce中创建了自己需要用到的对象后,我们想要在别的应用中读写纪录到对象中,首先需要的是自己Salesforce平台的权限通过。登陆自己的Salesforce,下载WSDL文件。
依次点击右上角你的名字中设置--》应用程序设置--》发展--》API。
如果你的是英文,那么依次点击Your Name --》 Setup --》 App Setup --》 Develop --》 API。
到了如下页面后,下载图中的三个WSDL文件。
2.下载并构建WSC Jar,然后把对应的wsdl文件编译成对应jar
这里官方的方法是下载github中的Salesforces的WSC项目 https://github.com/forcedotcom/wsc 在github中也有WSC把wsdl文件生成jar的教程,但是当我执行到mvn clean package 清理WSC项目的时候便进行不下去了,是因为下载某些包的时候链接是外网,尽管有翻墙,但还是更新失败,而且速度很慢,最后只有失败告终。于是我去寻找另外的方法。究其原理,不过也就是为了获取一个WSC的jar,然后通过cmd的命令来构建wsdl文件的jar文件,然后把这些jar文件引入到java项目中,便可以读写Salesforce中的对象。
在这个链接 http://code.google.com/p/sfdc-wsc/downloads/list 中下载wsc的jar文件。其中我下载的是wsc-23.jar文件。如果打不开网址,需要翻一下墙,下载如果不能继续,试下右键 用迅雷下载,我的就是用迅雷下载的,如果有会员,那最多十几秒的事情。
下载完成后,便是把wsdl文件编译成对应jar。这里我用windows系统。把刚才下载的jar包和3个wsdl文件放在同一个文件夹中,打开cmd黑色的命令窗,先用cd命令进入到对应的文件夹中。接下来cmd命令窗口中输入如下:
java -classpath wsc-.jar com.sforce.ws.tools.wsdlc enterprise.wsdl enterprise.jar java -classpath wsc-.jar com.sforce.ws.tools.wsdlc partner.wsdl partner.jar java -classpath wsc-.jar com.sforce.ws.tools.wsdlc metadata.wsdl metadata.jar
这里需要先安装java的jdk,本来是开发java的程序来读写Salesforce的对象和数据,我就当大家都已经装好了jdk的了。如果执行没有问题,那么你的文件夹应该多了3个jar文件,最后整个文件夹便变成:
3.创建程序并引用外部jar文件
准备就绪,接下来想开发任何程序都可以了,web,server,安卓(安卓和IOS有另外的SDK,没必要用这种方法,个人理解)等等都行了。
创建java程序和引用jar外部包我就不解释,要应用的jar就是上图文件夹中的4个jar,对,wsc-23.jar也要
package wsc; import com.sforce.soap.enterprise.Connector;
import com.sforce.soap.enterprise.DeleteResult;
import com.sforce.soap.enterprise.EnterpriseConnection;
import com.sforce.soap.enterprise.Error;
import com.sforce.soap.enterprise.QueryResult;
import com.sforce.soap.enterprise.SaveResult;
import com.sforce.soap.enterprise.sobject.Account;
import com.sforce.soap.enterprise.sobject.Contact;
import com.sforce.ws.ConnectionException;
import com.sforce.ws.ConnectorConfig; public class Main { static final String USERNAME = "YOUR-USERNAME"; //Salesforce账号中的用户名
static final String PASSWORD = "YOUR-PASSWORD&SECURITY-TOKEN"; //密码,这个密码有点特殊,需要在密码后面加入安全标记
static EnterpriseConnection connection; public static void main(String[] args) { ConnectorConfig config = new ConnectorConfig();
config.setUsername(USERNAME);
config.setPassword(PASSWORD); try { connection = Connector.newConnection(config);
// 增删改查
queryContacts();
createAccounts();
updateAccounts();
deleteAccounts(); } catch (ConnectionException e1) {
e1.printStackTrace();
} } // queries and displays the 5 newest contacts
private static void queryContacts() { System.out.println("Querying for the 5 newest Contacts..."); try { // query for the 5 newest contacts
QueryResult queryResults = connection.query("SELECT Id, FirstName, LastName, Account.Name " +
"FROM Contact WHERE AccountId != NULL ORDER BY CreatedDate DESC LIMIT 5");
if (queryResults.getSize() > 0) {
for (int i=0;i<queryResults.getRecords().length;i++) {
// cast the SObject to a strongly-typed Contact
Contact c = (Contact)queryResults.getRecords()[i];
System.out.println("Id: " + c.getId() + " - Name: "+c.getFirstName()+" "+
c.getLastName()+" - Account: "+c.getAccount().getName());
}
} } catch (Exception e) {
e.printStackTrace();
} } // create 5 test Accounts
private static void createAccounts() { System.out.println("Creating 5 new test Accounts...");
Account[] records = new Account[5]; try { // create 5 test accounts
for (int i=0;i<5;i++) {
Account a = new Account();
a.setName("Test Account "+i);
records[i] = a;
} // create the records in Salesforce.com
SaveResult[] saveResults = connection.create(records); // check the returned results for any errors
for (int i=0; i< saveResults.length; i++) {
if (saveResults[i].isSuccess()) {
System.out.println(i+". Successfully created record - Id: " + saveResults[i].getId());
} else {
Error[] errors = saveResults[i].getErrors();
for (int j=0; j< errors.length; j++) {
System.out.println("ERROR creating record: " + errors[j].getMessage());
}
}
} } catch (Exception e) {
e.printStackTrace();
} } // updates the 5 newly created Accounts
private static void updateAccounts() { System.out.println("Update the 5 new test Accounts...");
Account[] records = new Account[5]; try { QueryResult queryResults = connection.query("SELECT Id, Name FROM Account ORDER BY " +
"CreatedDate DESC LIMIT 5");
if (queryResults.getSize() > 0) {
for (int i=0;i<queryResults.getRecords().length;i++) {
// cast the SObject to a strongly-typed Account
Account a = (Account)queryResults.getRecords()[i];
System.out.println("Updating Id: " + a.getId() + " - Name: "+a.getName());
// modify the name of the Account
a.setName(a.getName()+" -- UPDATED");
records[i] = a;
}
} // update the records in Salesforce.com
SaveResult[] saveResults = connection.update(records); // check the returned results for any errors
for (int i=0; i< saveResults.length; i++) {
if (saveResults[i].isSuccess()) {
System.out.println(i+". Successfully updated record - Id: " + saveResults[i].getId());
} else {
Error[] errors = saveResults[i].getErrors();
for (int j=0; j< errors.length; j++) {
System.out.println("ERROR updating record: " + errors[j].getMessage());
}
}
} } catch (Exception e) {
e.printStackTrace();
} } // delete the 5 newly created Account
private static void deleteAccounts() { System.out.println("Deleting the 5 new test Accounts...");
String[] ids = new String[5]; try { QueryResult queryResults = connection.query("SELECT Id, Name FROM Account ORDER BY " +
"CreatedDate DESC LIMIT 5");
if (queryResults.getSize() > 0) {
for (int i=0;i<queryResults.getRecords().length;i++) {
// cast the SObject to a strongly-typed Account
Account a = (Account)queryResults.getRecords()[i];
// add the Account Id to the array to be deleted
ids[i] = a.getId();
System.out.println("Deleting Id: " + a.getId() + " - Name: "+a.getName());
}
} // delete the records in Salesforce.com by passing an array of Ids
DeleteResult[] deleteResults = connection.delete(ids); // check the results for any errors
for (int i=0; i< deleteResults.length; i++) {
if (deleteResults[i].isSuccess()) {
System.out.println(i+". Successfully deleted record - Id: " + deleteResults[i].getId());
} else {
Error[] errors = deleteResults[i].getErrors();
for (int j=0; j< errors.length; j++) {
System.out.println("ERROR deleting record: " + errors[j].getMessage());
}
}
} } catch (Exception e) {
e.printStackTrace();
} } }
例子中如果需要用到新的对象,比如我自己创建的Position对象,那么可以在对象的详细页面找到对象对应的api名称,以及对象中字段api名称,如下图
找到对应的api名称后,如果需要创建一条Position纪录,那么可以这样new一个对象 Position__c a = new Position__c(); 然后通过Set的扩展方法来对对象字段的值进行赋值便可。
Salesforce中通过SOAP API和Metadata API开发java的web server服务的更多相关文章
- arcgis api for js入门开发系列二不同地图服务展示(含源代码)
上一篇介绍了arcgis api离线部署,这篇开始正式介绍arcgis api for js开发:想要学习webgis开发,首先得熟悉了解前端技术,比如界面布局设计的html+css,核心的是java ...
- ubuntu16.04-x64系统中Jexus web server部署.NetCore和端口分析引发的猜想!
您有这样的牢骚么? 有一周没更新博客了,简单说下在干什么吧:主要是公司安排对接某旅游大公司的接口,接口数量倒也就10个左右,对接完后还需要加入到业务系统中和App端,因此还是需要花点时间的:时间上来说 ...
- C#中自己动手创建一个Web Server(非Socket实现)
目录 介绍 Web Server在Web架构系统中的作用 Web Server与Web网站程序的交互 HTTPListener与Socket两种方式的差异 附带Demo源码概述 Demo效果截图 总结 ...
- Android开发-API指南-<meta-data>
<meta-data> 英文原文:http://developer.android.com/guide/topics/manifest/meta-data-element.html 采集( ...
- API网关在API安全性中的作用
从单一应用程序切换到微服务时,客户端的行为不能与客户端具有该应用程序的一个入口点的行为相同.简单来说就是微服务上的某一部分功能与单独实现该应用程序时存在不同. 目前在使用微服务时,客户端必须处理微服务 ...
- salesforce 零基础学习(五十五)java通过SOAP方式定时访问某个文件然后插入到sObject中
项目源码:https://github.com/zhangyueqidlmu/SOAP-Access-SFDC.git 项目背景:salesforce端相关数据需要其他系统提供,其他系统可以提供相关数 ...
- HTML5中与页面显示相关的API
1.HTML5中与页面显示相关的API 在HTML5中,增加了几个与页面显示相关的API,其中一个是Page Visibility API Page Visibility API 是指当页面变为最小 ...
- 【ASP.NET Web API教程】5.5 ASP.NET Web API中的HTTP Cookie
原文:[ASP.NET Web API教程]5.5 ASP.NET Web API中的HTTP Cookie 5.5 HTTP Cookies in ASP.NET Web API 5.5 ASP.N ...
- 【ASP.NET Web API教程】4.3 ASP.NET Web API中的异常处理
原文:[ASP.NET Web API教程]4.3 ASP.NET Web API中的异常处理 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内 ...
随机推荐
- AWS系列-AWS EC2实例类型改配(机器配置升级)
1.1 EC2实例升级需要先把升级的实例停机才能升级 1.2 如图选择需要升级的EC2,点击操作,实例设置,更改实例类型 1.3 选择你要想的配置,点击应用 1.4 启动EC2实例即可
- Struts2_day04--课程介绍_Struts2拦截器概述&底层原理_重要的概念
Struts2_day04 上节内容 今天内容 Struts2拦截器概述 拦截器底层原理 重要的概念 自定义拦截器 自定义登录拦截器 Struts2的标签库 Struts2表单标签(会用) Strut ...
- 让iOS应用支持不同版本的系统与设备
本文转载至 http://blog.csdn.net/pucker/article/details/11980811 最近一直在做app的iOS 6和7的同时适配工作,所以在此介绍一下系统与设备的兼 ...
- 五 Android Studio打包Eegret App (包名和签名,打出正式包)
一 定义包名 如下图,在AndroidManifest.xml中的package就是包名 二 创建keystore 选择Build->Generate Signed APK 选择create n ...
- echart使用总结
以下参数都是写在option配置对象内,没有提及的配置参数欢迎查阅读echart参考手册. 一. 修改主标题和副标题 title : { text: '未来一周气温变化',//写入主标题 subtex ...
- FTP服务工作原理
1. FTP协议 什么是FTP呢?FTP 是 TCP/IP 协议组中的协议之一,是英文File Transfer Protocol的缩写. 该协议是Internet文件传送的基础,它由一系列规格说明文 ...
- [iOS微博项目 - 4.4] - 会员标识
github: https://github.com/hellovoidworld/HVWWeibo A.会员标识 1.需求 给vip会员打上会员标识 不同等级的vip会员使用不同的标识 使用橙色作为 ...
- 如何查看电脑最大支持多少GB内存
第一种方法: 1.打开“开始”菜单,点击“运行”按钮,也可以直接使用[Win + R]组合快捷键打开, 在弹出来的窗口输入“CMD”,然后确定或者按下回车键 2.在命令窗口输入“wmic memphy ...
- ICO成本价
[当前ICO成本价]仅供参考:ICOcoin 成本价1元SNT 成本价0.26元UGT 成本价2.7元PAY 成本价6元OMG 成本价2.6元YOYO 成本价 0.17元BNT 成本价26元BAT 成 ...
- python序列化和json
python 的序列化和反序列化用于内存之间的共享,包括服务器和客户端的共享,两个Python程序之间的共享,以及以字符串的形式存储到硬盘中. pyhton 的pickle 可以对Python的各种数 ...