我正在尝试使用 NetSuite SuiteTalk REST Web 服务来访问 NetSuite CRM 数据。
我可以访问并在生产中工作。能够检索记录数据和元数据。
我现在正在尝试在沙箱中设置访问权限以进行更深入的测试。
在沙盒中我有: - 启用休息网络服务 - 启用基于令牌的身份验证 - 给予用户并发网络服务许可 - 给定用户使用访问令牌权限登录 - 创建了一个集成 - 创建了一个访问令牌
所有这些行动都反映了生产中所做的事情。
当我尝试对 Web 服务进行任何类型的 GET 时,我收到 401 - 无效登录尝试。
当我检查登录审计跟踪时,我没有看到任何 GET 尝试、失败或其他情况的记录。
我是否必须在沙箱中额外做一些系统性的事情来启用 rest web 服务?超越在 SuiteCloud/SuiteTalk 中启用它?
我在审计线索中完全看不到任何东西这一事实让我相信某些东西仍然“关闭”。
===> 2020/4/4 更新
ed14 和 Nihkil,
感谢您的回复,很抱歉延迟回复。
不幸的是,领域中下划线的连字符对我没有帮助。
让我回顾一下最近的尝试:
1) 首先验证生产中的 REST API 测试是否仍然有效。
2) 沙箱由 CRM 管理员刷新。应用程序仍然存在,但我的访问令牌不在了。我在沙盒中创建了一个新的。
是否可以删除应用程序?我看不出有什么办法。
3) 使用现有的消费者令牌和新的访问令牌进行测试。得到与我的第一篇文章相同的回复:“标题”:“无效的登录尝试,有关更多详细信息,请参阅登录审计跟踪。”,
4) 通过稍微修改 URL 进行测试,以确保我不会去某个地方的黑洞。它给了我预期的错误。
5) 通过修改领域进行测试:领域 9999999-sb4 到领域 9999999_sb4 它给了我一个错误,让我相信我的原始领域是正确的:“标题”:“发生意外错误。错误 ID:k8hd8pqej3unxblmaoik”,
同样,没有任何测试在审计日志中的任何地方显示为失败尝试。
不确定从这里去哪里?删除沙箱应用程序(如果可能)并重新开始?还是沙箱中的新应用程序?
感谢所有帮助。
布莱恩亨特
我在使用沙箱时遇到了同样的问题。显然,帐户 ID(用于领域授权)与 URL 中的帐户 ID 不匹配。
账户ID(领域):XXXXX_SB1
url中的账户ID:XXXXX-SB1
SB
应该是大写的。
这解决了我的问题。
在 Postman 的请求选项卡中,然后在高级部分的授权选项卡中,有一个名为 Realm 的字段。将帐户 ID 放在带下划线的领域字段中。
我的 C# 代码中有同样的错误。 我将 Realm(netsuiteAccountId)“xxxxxxx-sb1”更改为“xxxxxxx_SB1”。 _SB 应该是大写的。
这对我来说很好。
var consumer_key = "abcde12345";
var consumer_secret = "12345abcde";
var tkey = "1a2b3c4d5e";
var token_secret = "a12b3c4d5e";
var URL = "https://xxxxxxx-sb1.restlets.api.netsuite.com/xxx/site/hosting/xxx.nl?xxxx=xxxx&deploy=x";
var client = new RestClient(URL);
var oAuth1 = OAuth1Authenticator.ForAccessToken(
consumerKey: consumer_key,
consumerSecret: consumer_secret,
token: tkey,
tokenSecret: token_secret,
OAuthSignatureMethod.HmacSha256);
var netsuiteAccount = "xxxxxxx_SB1"; // "xxxxxxx-sb1" change to "xxxxxxx_SB1"
oAuth1.Realm = netsuiteAccount;
client.Authenticator = oAuth1;
var request = new RestRequest(URL, Method.POST);
request.AddHeader("Content-Type", "application/json");
string body = "{\"start\": {\"from\": 12345, \"to\": 67890 } ";
request.AddParameter("application/json", body, ParameterType.RequestBody);
var response = client.Execute(request);