0

我正在尝试从 API 中提取 JSON 数据并努力确定问题的根源。目前,如果 message = "" 我得到准确的数据,但到目前为止,任何非空查询参数都会返回 403 错误。API 文档要求将参数格式化为“customerCode=XXX”,我已经能够在 API 沙箱中生成有效的查询。我认为问题出在 getSignature 函数的某个地方,但我已经用几种方法重写了它,并且 .encode() 或 bytes() 给了我相同的结果。如果代码看起来连贯,并且我的结果是语法错误,我可以联系支持团队。同样,当 message 是一个空字符串时,我会得到有效的结果,所以我很困惑。在每个页面测试多个不同查询参数的所有测试报告页面上都会发生错误。

#Current hash
def getSignature(message):
    hashed = hmac.new(key, message.encode('utf-8') , hashlib.sha256)
    return base64.b64encode(hashed.digest())


#Header per API specs
def getData(report, message):
    headers = {
        'Content-Type' : 'application/json',
        'Accept' : 'application/json',
        'api-auth-id' : api_id,
        'api-auth-signature' : getSignature(message)                
    }

    data = requests.get(url + report, headers=headers)
    data = data.json()

    return data
4

1 回答 1

0

编辑:我刚刚注意到它message仅用于签名,并未包含在请求中。我想你可能需要类似的东西data = requests.get(url + report, data=message, headers=headers)

旧的,几乎可以肯定不正确的理论如下:

由于它适用于空消息,我的猜测是它与消息的字节编码有关。空消息的 utf-16 或 utf-32 编码将与 utf-8 相同,但对于非空消息它们会有所不同。

所以也许试试message.encode('utf-16')or message.encode('utf-32')?API 文档应描述如何完成身份验证的详细信息。

是否可以链接到 API 的文档,还是内部的?

于 2018-03-01T23:17:13.040 回答