用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 uri
			final String baseUrl = salesforceAuthenticator.instanceUrl + "/services/data/v52.0/sobjects/Account/";
			URI uri = new URI(baseUrl);
			
			// request header
			HttpHeaders headers = new HttpHeaders();
			headers.setContentType(MediaType.APPLICATION_JSON);
			headers.add(HttpHeaders.AUTHORIZATION, String.format("Bearer %s", salesforceAuthenticator.accessToken));

			// request body
			Map<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 request
			HttpEntity<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 request
			HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
			requestFactory.setConnectTimeout(2000);			 
			restTemplate.setRequestFactory(requestFactory);
                        
			// set uri
			final String baseUrl = salesforceAuthenticator.instanceUrl + "/services/data/v52.0/sobjects/Account/"
					+ id;
			URI uri = new URI(baseUrl);
			
			// request header
			HttpHeaders headers = new HttpHeaders();
			headers.setContentType(MediaType.APPLICATION_JSON);
			headers.add(HttpHeaders.AUTHORIZATION, String.format("Bearer %s", salesforceAuthenticator.accessToken));

			// request body
			Map<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 request
			HttpEntity<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,因为比较简单,操作也类似,就不举例了。

以上

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值