如何从Salesforce或其他应用调用NetSuite RESTlet并传递数据?
NetSuite RESTlet 集成调用指南
一、通用认证要求
无论从Salesforce还是其他应用调用NetSuite RESTlet,必须先完成认证,NetSuite支持两种主流方式:
- OAuth 1.0a:需提前获取Consumer Key、Consumer Secret、Token ID、Token Secret,请求时生成签名。
- Token-Based Authentication (TBA):使用NetSuite生成的Access Token和Token Secret,在请求头中携带:
Authorization: NLAuth nlauth_account=<ACCOUNT_ID>,nlauth_email=<EMAIL>,nlauth_signature=<TOKEN_SECRET>,nlauth_token=<ACCESS_TOKEN>。
二、Salesforce 集成调用示例
1. Apex 代码调用(推荐)
通过Apex编写HTTP请求对接RESTlet,以下是对应你脚本各方法的示例:
GET 请求(查询客户)
你的RESTlet GET方法通过requestParams.id获取客户ID,需将ID作为URL查询参数传递:
public class NetSuiteRESTletCallout { public static void getCustomer() { Http http = new Http(); HttpRequest request = new HttpRequest(); // 替换为你的RESTlet实际URL request.setEndpoint('https://<你的NetSuite账户ID>.restlets.api.netsuite.com/app/site/hosting/restlet.nl?script=<脚本ID>&deploy=<部署ID>&id=123'); request.setMethod('GET'); // 替换为TBA认证头(或OAuth1.0a签名) request.setHeader('Authorization', 'NLAuth nlauth_account=<ACCOUNT_ID>,nlauth_email=<你的NetSuite邮箱>,nlauth_signature=<TOKEN_SECRET>,nlauth_token=<ACCESS_TOKEN>'); request.setHeader('Content-Type', 'application/json'); HttpResponse response = http.send(request); if (response.getStatusCode() == 200) { System.debug('客户数据:' + response.getBody()); } else { System.debug('请求失败:' + response.getStatusCode() + ' - ' + response.getBody()); } } }
POST 请求(创建客户)
你的RESTlet POST方法从requestBody获取recordType、companyname、subsidiary,需构造JSON格式请求体:
public static void createCustomer() { Http http = new Http(); HttpRequest request = new HttpRequest(); request.setEndpoint('https://<你的NetSuite账户ID>.restlets.api.netsuite.com/app/site/hosting/restlet.nl?script=<脚本ID>&deploy=<部署ID>'); request.setMethod('POST'); request.setHeader('Authorization', 'NLAuth nlauth_account=<ACCOUNT_ID>,nlauth_email=<你的NetSuite邮箱>,nlauth_signature=<TOKEN_SECRET>,nlauth_token=<ACCESS_TOKEN>'); request.setHeader('Content-Type', 'application/json'); // 构造请求体,匹配RESTlet所需字段 String requestBody = '{ "recordType": "customer", "companyname": "Salesforce测试客户", "subsidiary": 1 }'; request.setBody(requestBody); HttpResponse response = http.send(request); System.debug('创建结果:' + response.getBody()); }
PUT 请求(更新客户)
你的RESTlet PUT方法从requestBody.customerid获取目标客户ID,请求体需包含该字段:
public static void updateCustomer() { Http http = new Http(); HttpRequest request = new HttpRequest(); request.setEndpoint('https://<你的NetSuite账户ID>.restlets.api.netsuite.com/app/site/hosting/restlet.nl?script=<脚本ID>&deploy=<部署ID>'); request.setMethod('PUT'); request.setHeader('Authorization', 'NLAuth nlauth_account=<ACCOUNT_ID>,nlauth_email=<你的NetSuite邮箱>,nlauth_signature=<TOKEN_SECRET>,nlauth_token=<ACCESS_TOKEN>'); request.setHeader('Content-Type', 'application/json'); String requestBody = '{ "customerid": 123 }'; request.setBody(requestBody); HttpResponse response = http.send(request); System.debug('更新结果:' + response.getBody()); }
DELETE 请求(删除客户)
你的RESTlet DELETE方法从requestParams.customerId获取客户ID,需将其作为URL查询参数传递:
public static void deleteCustomer() { Http http = new Http(); HttpRequest request = new HttpRequest(); request.setEndpoint('https://<你的NetSuite账户ID>.restlets.api.netsuite.com/app/site/hosting/restlet.nl?script=<脚本ID>&deploy=<部署ID>&customerId=123'); request.setMethod('DELETE'); request.setHeader('Authorization', 'NLAuth nlauth_account=<ACCOUNT_ID>,nlauth_email=<你的NetSuite邮箱>,nlauth_signature=<TOKEN_SECRET>,nlauth_token=<ACCESS_TOKEN>'); HttpResponse response = http.send(request); if (response.getStatusCode() == 204) { System.debug('删除成功'); } else { System.debug('删除失败:' + response.getStatusCode()); } }
2. Salesforce Flow 调用
无需复杂代码时,可使用Flow的HTTP Callout元素:
- 配置请求URL、方法、认证头(TBA方式直接填写Authorization头内容)
- GET/DELETE方法在URL后拼接查询参数
- POST/PUT方法在请求体中构造JSON字符串,映射Flow内的变量
三、其他应用集成通用示例
以Python为例,展示各方法的调用方式:
GET 请求
import requests url = "https://<你的NetSuite账户ID>.restlets.api.netsuite.com/app/site/hosting/restlet.nl" params = { "script": "<脚本ID>", "deploy": "<部署ID>", "id": "123" } headers = { "Authorization": "NLAuth nlauth_account=<ACCOUNT_ID>,nlauth_email=<你的NetSuite邮箱>,nlauth_signature=<TOKEN_SECRET>,nlauth_token=<ACCESS_TOKEN>", "Content-Type": "application/json" } response = requests.get(url, params=params, headers=headers) print(response.json())
POST 请求
import requests url = "https://<你的NetSuite账户ID>.restlets.api.netsuite.com/app/site/hosting/restlet.nl?script=<脚本ID>&deploy=<部署ID>" headers = { "Authorization": "NLAuth nlauth_account=<ACCOUNT_ID>,nlauth_email=<你的NetSuite邮箱>,nlauth_signature=<TOKEN_SECRET>,nlauth_token=<ACCESS_TOKEN>", "Content-Type": "application/json" } payload = { "recordType": "customer", "companyname": "Python测试客户", "subsidiary": 1 } response = requests.post(url, json=payload, headers=headers) print(response.json())
PUT 请求
import requests url = "https://<你的NetSuite账户ID>.restlets.api.netsuite.com/app/site/hosting/restlet.nl?script=<脚本ID>&deploy=<部署ID>" headers = { "Authorization": "NLAuth nlauth_account=<ACCOUNT_ID>,nlauth_email=<你的NetSuite邮箱>,nlauth_signature=<TOKEN_SECRET>,nlauth_token=<ACCESS_TOKEN>", "Content-Type": "application/json" } payload = { "customerid": 123 } response = requests.put(url, json=payload, headers=headers) print(response.json())
DELETE 请求
import requests url = "https://<你的NetSuite账户ID>.restlets.api.netsuite.com/app/site/hosting/restlet.nl" params = { "script": "<脚本ID>", "deploy": "<部署ID>", "customerId": "123" } headers = { "Authorization": "NLAuth nlauth_account=<ACCOUNT_ID>,nlauth_email=<你的NetSuite邮箱>,nlauth_signature=<TOKEN_SECRET>,nlauth_token=<ACCESS_TOKEN>" } response = requests.delete(url, params=params, headers=headers) print("删除状态码:", response.status_code)
四、参数传递规则(匹配你的RESTlet脚本)
根据你提供的代码,参数传递需遵循:
- GET/DELETE方法:参数通过URL查询参数传递,对应脚本中的
requestParams对象。比如GET的id、DELETE的customerId,直接拼在URL后?key=value。 - POST/PUT方法:参数通过JSON格式请求体传递,对应脚本中的
requestBody对象。必须设置请求头Content-Type: application/json,否则NetSuite无法解析请求体。
注意:你的PUT方法中硬编码了邮箱地址monika.phalle@theblueflamelabs.com,若需动态更新,建议修改脚本从requestBody.email取值,调用时即可传递不同邮箱。
内容的提问来源于stack exchange,提问作者Maira S
相关产品推荐
相关产品推荐

