Netsuite REST Web 服务 API GET 请求,Postman 之外

Netsuite REST Web Services API GET Request, Outside of Postman

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

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

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

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

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

Postman 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'))


提前致谢!

感谢 Josh 的推荐(请参阅对我的原始问题的评论),我成功地使用 oauthlib 的 oauth1 客户端在 Visual Studio 代码中发送请求。 nonce 和签名看起来与 Postman 在他们的代码片段中显示的略有不同,但它确实有效。对于尝试使用 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