邮递员之外的 Netsuite REST Web 服务 API GET 请求

Posted

技术标签:

【中文标题】邮递员之外的 Netsuite REST Web 服务 API GET 请求【英文标题】:Netsuite REST Web Services API GET Request, Outside of Postman 【发布时间】:2021-01-17 14:01:17 【问题描述】:

您好 Stack Overflow 社区,在此先感谢您的帮助:

社区问题: 除了重新发明 oauth ***之外,是否有任何提示/最佳实践可以在我的 python GET 请求中创建我自己的 oauth 签名/随机数以获取 Netsuite 的新 API(REST Web 服务;有关问题的上下文,请参见下文)?似乎其他在这方面取得成功的人都是通过反复试验来完成的,这也是我的计划,但理想情况下,我希望错误更少,并且再次,而不是重新发明***。非常欢迎任何提示、技巧和想法。请参阅下面的上下文

什么: 尝试使用 Netsuite 全新的 REST API(REST Web 服务)发出 GET 请求。这是与他们的 SOAP/RESTlet 不同的 API。

如何: 通过在 Visual Studio Code 中编写 Python 脚本。我成功地在 Postman 中提出请求。我将代码复制到 Postman 用来成功发出 GET 请求并收到 401 响应的 Visual Studio Code 中(见下文)。

遇到的问题: 我收到 401 响应,无效登录。没有关于如何在 Postman 之外与这个新的 REST API 成功交互的官方 Netsuite 文档,所以在阅读了 *** 和其他博客/出版物之后,我似乎需要创建自己的 oauth_signature、oauth_timestamp 和 oauth_nonce。

邮递员 GET 请求代码:

import requests

url = "https://123456-sb1.suitetalk.api.netsuite.com/services/rest/query/v1/workbook/custworkbook12345/result"

payload = 
headers = 
  'Authorization': 'OAuth realm="123456_SB1",oauth_consumer_key="123456789101112131415",oauth_token="123456789101112131415",oauth_signature_method="HMAC-SHA256",oauth_timestamp="123456789",oauth_nonce="123456789",oauth_version="1.0",oauth_signature="123456789101112131415"',
  'Cookie': 'NS_ROUTING_VERSION=LAGGING'


response = requests.request("GET", url, headers=headers, data = payload)

print(response.text.encode('utf8'))


提前致谢!

【问题讨论】:

是否有可以使用的 python oauth 库?我会从那里开始,而不是自己构建标题。这个 oauth 标头值有一些复杂性。 oauthlib.readthedocs.io/en/latest/oauth1/client.html 之类的东西? 谢谢 Josh,我会看看 oauthlib 并熟悉它的工作原理/试一试。貌似支持HMAC-SHA256,用HMAC-SHA256和HMAC-SHA1签名有什么要注意的吗? 我只是查看了我的代码,我使用的是 HMAC-SHA256。并且 oauth1 有一些非常时髦的东西,比如你必须将 signature_method 指定为“HMAC-SHA256”,然后还使用 python 散列库调用并实际使用 256 执行 hmac。希望你最终使用的任何 python 库都能做到这一点一切都为你秘密,它会变得混乱。 一个有趣的提示,以防它帮助你:必须及时生成随机数才能请求调用。如果您执行类似生成它的操作,然后等待 5 分钟,您将获得 401,因为随机数在 30-60 秒后“过期”。 而 netsuite 刚刚发布了一些关于领域是可选的更新,我还没有费心去研究它,但仅供参考,领域现在实际上可能是可选的,而且,netsuite 文档可能会非常有趣日期或错误照常。 【参考方案1】:

感谢 Josh 的推荐(请参阅我原来的问题的 cmets),我成功使用 oauthlib 的 oauth1 客户端在 Visual Studio Code 中发送请求。随机数和签名看起来与 Postman 在他们的代码 sn-p 中显示的有点不同,但它确实有效。对于任何尝试使用 Netsuite 的 REST Web 服务做同样事情的人,我建议走这条路。

我发送成功 GET 请求的代码:

import requests
import oauthlib.oauth1
import json


url = "https://12345-sb1.suitetalk.api.netsuite.com/services/rest/query/v1/dataset/custdataset1/result"

payload = 

client = oauthlib.oauth1.Client('consumer key', client_secret='12345',
    resource_owner_key='12345', resource_owner_secret='12345', realm='12345_SB1',signature_method="HMAC-SHA256")
url, headers, body = client.sign('https://4635201-sb4.suitetalk.api.netsuite.com/services/rest/query/v1/dataset/custdataset1/result')


response = requests.request("GET", url, headers=headers, data = payload)

print(response.text.encode('utf8'))

一些额外的有用说明 -

我正在 Netsuite Sandbox 中对此进行测试,因此是“12345_SB1”领域。如果 您不在沙盒中,您不需要下划线 SB。只需使用您的帐号 ID。 我正在提取 Netsuite 分析报告,此时该报告仍在 新 API(REST Web 服务)的测试版。 我使用了 Josh 推荐的 Python oauthlib,我建议你也这样做,link here

【讨论】:

您是如何获得您的 consumer_key、c​​lient_secret、resource_owner_key 和 resource_owner_secret 的?我多年来一直使用 SHA1,并且使用了集成附带的密钥/秘密。但现在我试图切换到 SHA256 并且相同的密钥给出了无效的登录错误。

以上是关于邮递员之外的 Netsuite REST Web 服务 API GET 请求的主要内容,如果未能解决你的问题,请参考以下文章

Netsuite - REST API - 使用基于令牌的身份验证 (TBA) 进行查询 - (在 Python 中)

Netsuite - REST API - 如何使用基于令牌的身份验证 (TBA) 创建新条目记录 - (在 Python 中)

NetSuite REST API - 如何更新销售订单与跟踪号一起发货

Netsuite - REST API (restlet) - 创建记录导致 INVALID_LOGIN_ATTEMPT 在第二次和更多记录请求失败

如何通过邮递员使用 REST 调用在 SharePoint 2019 上创建文件夹?得到 403:禁止错误

Spring REST控制器在某些模型字段的绑定值中出现问题