用Springboot(java程序)访问Salesforce RestAPI之二(Update和Create)

在上一篇博文中,介绍了Springboot连接Salesforce的步骤和环境构建。
其中,只给出了对Salesforce数据进行查询的例子,这篇文章针对Salsforce数据的Update和Create,再展开一下。

对于Create和Update的操作,请求的方式和URL是不同于查询的。
详见Salesforce的官方文档。(Rest API Developer Guide)

1. 创建(Create)一条新的Salesforce数据

请求方法:POST
请求URL:(以Account为例)https://MyDomainName.my.salesforce.com/services/data/v56.0/sobjects/Account/

代码:in SalesforceDataService.java

	public Map createSalesforceData() {SalesforceAuthenticator salesforceAuthenticator = SalesforceAuthenticator.getSalesforceToken();try {RestTemplate restTemplate = new RestTemplate();// set urifinal String baseUrl = salesforceAuthenticator.instanceUrl + "/services/data/v52.0/sobjects/Account/";URI uri = new URI(baseUrl);// request headerHttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);headers.add(HttpHeaders.AUTHORIZATION, String.format("Bearer %s", salesforceAuthenticator.accessToken));// request bodyMap<String, Object> accCreate = new HashMap<>();accCreate.put("Name", "Create from Java");accCreate.put("Phone", "080-1234-5678");ObjectMapper mapper = new ObjectMapper();String requestBody = mapper.writeValueAsString(accCreate);System.out.println("requestBody = " + requestBody); // build the requestHttpEntity<String> entity = new HttpEntity<>(requestBody, headers);ResponseEntity<Map> response = null;try {response = restTemplate.exchange(uri, HttpMethod.POST, entity, Map.class);System.out.println("createAccount StatusCode = " + response.getStatusCode()); } catch (HttpClientErrorException e) {System.out.println("HttpClient Error : " + e.getMessage());}return response.getBody();} catch (Exception e) {System.out.println("System error : " + e.getMessage());}return Collections.emptyMap();}

注意,Response返回201,Body会返回已经创建好的数据的ID。

{"id" : "001D000000IqhSLIAZ","errors" : [ ],"success" : true
}

2. 更新(Update)一条Salesforce的数据

请求方法:PATCH
请求URL:(以Account为例)

https://MyDomainName.my.salesforce.com/services/data/v56.0/sobjects/Account/001D000000INjVe

注意:Java的HttpClient是不支持PATCH方式的。所以,这里有两种方法可以参考:

  1. 可以根据官方的文档,重写PostMethod方法
  2. 我在网上找到了另一种方式,可以给restTemplate设定一下RequestFactory

代码如下:in SalesforceDataService.java

	public void updateSalesforceData(String id) {SalesforceAuthenticator salesforceAuthenticator = SalesforceAuthenticator.getSalesforceToken();try {RestTemplate restTemplate = new RestTemplate();// set RequestFactory for PATCH requestHttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();requestFactory.setConnectTimeout(2000);			 restTemplate.setRequestFactory(requestFactory);// set urifinal String baseUrl = salesforceAuthenticator.instanceUrl + "/services/data/v52.0/sobjects/Account/"+ id;URI uri = new URI(baseUrl);// request headerHttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);headers.add(HttpHeaders.AUTHORIZATION, String.format("Bearer %s", salesforceAuthenticator.accessToken));// request bodyMap<String, Object> accUpdate = new HashMap<>();accUpdate.put("Upsert_test__c", "Update from Java");accUpdate.put("ForTestItem__c", "Spring Boot 101");ObjectMapper mapper = new ObjectMapper();String requestBody = mapper.writeValueAsString(accUpdate);System.out.println("requestBody = " + requestBody); // build the requestHttpEntity<String> entity = new HttpEntity<>(requestBody, headers);ResponseEntity<Map> response = null;try {response = restTemplate.exchange(uri, HttpMethod.PATCH, entity, Map.class);System.out.println("updateAccount StatusCode = " + response.getStatusCode()); } catch (HttpClientErrorException e) {System.out.println("HttpClient Error : " + e.getMessage());}} catch (Exception e) {System.out.println("System error : " + e.getMessage());}return;}

注意,Response返回204,是没有Body的。
还有一点强调的是,Update的URL需要传入你要更新的Record ID,所以每次只能更新一条数据。如果数据不多,可以循环调用这个API。官方的说明是,如果更新的数据超过100条,最好就不要选择这种方式了,要尽量使用Bulk API。

还有Delete,因为比较简单,操作也类似,就不举例了。

以上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/6003.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一周零碎时间练习微服务(nacos,rq,springcloud,es等)内容

目录 1 总览1.1 技术架构1.2 其他1.2.1 数据库1.2.2 后端部分1.2.2.1 复习feign1.2.2.2 复习下网关网关的核心功能特性&#xff1a;网关路由的流程断言工厂过滤器工厂全局过滤器 过滤器执行顺序解决跨域问题 1.2.2.3 es部分复习 1.2.3 前端部分 2 day1 配置网关2.1 任务2.2 网关…

ThreeJS:项目搭建

介绍如何基于Vite、Vue、React构建ThreeJS项目。 Vite项目 1. 初始化项目&#xff0c;命令&#xff1a;npm init vitelatest&#xff0c; 2. 安装依赖&#xff0c;命令&#xff1a;npm install&#xff0c; 3. 启动项目&#xff0c;命令&#xff1a;npm run dev。 4. 样式初始…

【LeetCode刷题记录】简单篇-94-二叉树的中序遍历

【题目描述】 给定一个二叉树的根节点 root &#xff0c;返回 它的 中序 遍历 。 【测试用例】 示例1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,3,2] 示例2&#xff1a; 输入&#xff1a;root [ ] 输出&#xff1a;[ ] 示例3&#xff1a; 输入…

Rust 动态数组Vector

导航 一、动态数组是什么&#xff0c;怎么用1、动态数组Vector是什么2、动态数组怎么用&#xff08;1&#xff09;创建动态数组&#xff08;2&#xff09;尾部追加元素&#xff08;3&#xff09;尾部删除元素&#xff08;4&#xff09;删除指定位置元素&#xff08;5&#xff0…

ThreeJS:本地部署官网文档与案例

部署方式 部署之前请确保已经配置好node.js环境。 1. 下载ThreeJS源码 ThreeJS的GitHub地址&#xff1a;GitHub - mrdoob/three.js: JavaScript 3D Library.&#xff0c;可以简单查看ThreeJS当前版本&#xff1a;r164&#xff0c; 我们可以选择对应的版本&#xff08;此处为r1…

win11 Terminal 部分窗口美化

需求及分析&#xff1a;因为在 cmd、anaconda prompt 窗口中输入命令较多&#xff0c;而命令输入行和输出结果都是同一个颜色&#xff0c;不易阅读&#xff0c;故将需求定性为「美化窗口」。 美化结束后&#xff0c;我在想是否能不安装任何软件&#xff0c;简单地通过调整主题颜…

boost::asio::ip::tcp::socket set_option

Boost asio 官方教程简介_asio::write-CSDN博客 boost::asio::ip::tcp::socket 是一个用于异步I/O操作的类&#xff0c;它是Boost.Asio库的一部分&#xff0c;专门用于处理TCP套接字。 以下是一个简单的使用 boost::asio::ip::tcp::socket 的例子&#xff0c;这个例子展示了如…

备考2024年上海初中生古诗文大会:单选题真题示例和独家解析

现在距离2024年初中生古诗文大会还有四个多月时间&#xff0c;备考要趁早&#xff0c;因为知识点还是相对比较多的。这些知识点对于初中语文的学习也是很有帮助的。 我们继续来看10道历年真题&#xff0c;这些真题来自于过去历年真题的去重、汇总&#xff0c;每道题都有参考答…

2-手工sql注入(进阶篇) sqlilabs靶场1-4题

1. 阅读&#xff0c;学习本章前&#xff0c;可以先去看看基础篇&#xff1a;1-手工sql注入(基础篇)-CSDN博客 2. 本章通过对sqlilabs靶场的实战&#xff0c;关于sqlilabs靶场的搭建&#xff1a;Linux搭建靶场-CSDN博客 3. 本章会使用到sqlmap&#xff0c;关于sqlmap的命令&…

机器翻译常用指标BLEU

诸神缄默不语-个人CSDN博文目录 文章目录 什么是BLEU指标&#xff1f;BLEU指标的原理BLEU的计算公式BLEU指标的Python实现 什么是BLEU指标&#xff1f; BLEU&#xff08;Bilingual Evaluation Understudy&#xff09;指标是一种评估机器翻译质量的方法&#xff0c;广泛用于自然…

salesforce vscode 获取profile metadata所有配置内容

1.更新cli&#xff1a;sfdx update 2.安装read插件&#xff1a;sfdx plugins:install sfdx-plugin-source-read 3.通过vscode☁️&#xff08;org browser&#xff09;或者package.xml拉取profile&#xff0c;此时获取的简档没有所有配置内容 <?xml version"1.0&qu…

PostgreSQL自带的命令行工具02- createdb

PostgreSQL自带的命令行工具02- createdb 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;5777createdb 是 Postgr…

2024五一数学建模C题煤矿深部开采冲击地压危险预测原创论文分享

大家好&#xff0c;从昨天肝到现在&#xff0c;终于完成了2024五一数学建模竞赛C题的完整论文啦。 实在精力有限&#xff0c;具体的讲解大家可以去讲解视频&#xff1a; 2024五一数学建模C题完整原创论文讲解&#xff0c;手把手保姆级教学&#xff01;_哔哩哔哩_bilibili 202…

003 redis分布式锁 jedis分布式锁 Redisson分布式锁 分段锁

文章目录 Redis分布式锁原理1.使用set的命令时&#xff0c;同时设置过期时间2.使用lua脚本&#xff0c;将加锁的命令放在lua脚本中原子性的执行 Jedis分布式锁实现pom.xmlRedisCommandLock.javaRedisCommandLockTest.java 锁过期问题1乐观锁方式&#xff0c;增加版本号(增加版本…

自动控制工程技术人员的工作内容有哪些

自动控制工程技术人员主要负责开发和维护自动化系统和控制仪器&#xff0c;他们的工作内容涵盖了从系统设计、实施到测试和优化各个方面。以LabVIEW&#xff08;一种广泛使用的图形编程语言&#xff0c;用于数据采集、仪器控制和工业自动化&#xff09;为例&#xff0c;自动控制…

npm一篇通

npm 是什么&#xff1f; npm&#xff0c;全称Node Package Manager&#xff0c;是随Node.js一起分发的开源包管理系统&#xff0c;也是JavaScript生态中最流行的依赖管理工具。npm可以用于安装、管理和发布JavaScript模块。 对于Java后端开发人员来说&#xff0c;可以将其等同…

Python面试十问

一、深浅拷贝的区别&#xff1f; 浅拷⻉&#xff1a; 拷⻉的是对象的引⽤&#xff0c;如果原对象改变&#xff0c;相应的拷⻉对象也会发⽣改变。 深拷⻉&#xff1a; 拷⻉对象中的每个元素&#xff0c;拷⻉对象和原有对象不在有关系&#xff0c;两个是独⽴的对象。 浅拷⻉(c…

python和R对比记忆

PythonRMySQL数据类型 整型int 浮点型float 字符串str 布尔型bool 【特殊】None类型和复数类型 【用户自定义】类和对象 数值型 字符型 逻辑型 因子型factor[针对定性数据] 【特殊】时间序列类型time series、日期类型date、日期时间类型datetime 【用户自定义】S3对象、S4对…

探索高级聚类技术:使用LLM进行客户细分

在数据科学领域&#xff0c;客户细分是理解和分析客户群体的重要步骤。最近&#xff0c;我发现了一个名为“Clustering with LLM”的GitHub仓库&#xff0c;它由Damian Gil Gonzalez创建&#xff0c;专门针对这一领域提供了一些先进的聚类技术。在这篇文章中&#xff0c;我将概…

安卓手机APP开发__媒体开发部分__处理在声音输出中的变化

安卓手机APP开发__媒体开发部分__处理在声音输出中的变化 目录 概述 使用音量控制 程序化地控制流的音量 在固定音量的设备上工作 不要很大声的噪音 概述 用户期望能够控制一个音频APP的音量大小。标准的行为包括 使用音量控制的能力&#xff08;在设备上的按钮或者是用…