【问题标题】:Simple JSON Decode Error in Gemini API Started Out of NowhereGemini API 中的简单 JSON 解码错误突然出现
【发布时间】:2021-04-16 14:27:44
【问题描述】:

我正在尝试使用 Gemini 交易 API。我给自己颁发了一个 API 密钥和一个秘密,在配置了我的环境之后,我在通过 pip 设置和安装请求时遇到了很多问题,我使用他们的示例代码创建了一个简单的脚本来读取我最近的交易。这是脚本,减去我的 API 密钥:

#!/usr/bin/env/ python

import requests
import json
import base64
import hmac
import hashlib
import datetime, time

url = "https://api.sandbox.gemini.com"

gemini_api_key = "master-xxx"
gemini_api_secret = "xxx".encode()

t = datetime.datetime.now()
payload_nonce =  str(int(time.mktime(t.timetuple())*1000))
payload =  {"request": "/v1/mytrades", "nonce": payload_nonce}
encoded_payload = json.dumps(payload).encode()
b64 = base64.b64encode(encoded_payload)
signature = hmac.new(gemini_api_secret, b64, hashlib.sha384).hexdigest()

request_headers = {
    'Content-Type': "text/plain",
    'Content-Length': "0",
    'X-GEMINI-APIKEY': gemini_api_key,
    'X-GEMINI-PAYLOAD': b64,
    'X-GEMINI-SIGNATURE': signature,
    'Cache-Control': "no-cache"
    }

response = requests.post(url, headers=request_headers)

my_trades = response.json()
print(my_trades)

现在,起初它会运行,但给我一个错误,说我没有指定一个帐户。然后,根本没有改变任何东西,它突然完全停止工作。因此,虽然我在访问 API 时仍然遇到某种问题,但我什至无法再找到错误来尝试找出原因。现在我得到的是一个 JSON 解码错误,如下所示:

Traceback (most recent call last):
  File "c:\Users\david\Desktop\Code Projects\GeminiTrader\GeminiTrader-v0.1.py", 
line 33, in <module>
    my_trades = response.json()
  File "C:\Users\david\AppData\Local\Programs\Python\Python39\lib\site-packages\requests-2.25.1-py3.9.egg\requests\models.py", line 900, in json
    return complexjson.loads(self.text, **kwargs)
  File "C:\Users\david\AppData\Local\Programs\Python\Python39\lib\json\__init__.py", line 346, in loads
    return _default_decoder.decode(s)
  File "C:\Users\david\AppData\Local\Programs\Python\Python39\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Users\david\AppData\Local\Programs\Python\Python39\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

是什么导致了这个 json 解码问题?为什么之前没有出现,当 API 由于帐户参数错误而拒绝我的请求时?为什么没有我修改代码中的任何内容就突然变成了这个错误?我该如何解决?我一直在安装请求并使其正常工作时遇到问题,也许我在这个过程中搞砸了?

当然,在修复此问题后,我将要修复许多新问题,因为有关此 API 的文档非常糟糕。任何帮助推进这个项目将不胜感激!谢谢!

【问题讨论】:

  • 响应中没有 JSON。检查 HTTP 状态码!
  • 我在输出中看不到 http 状态代码。在哪里查看 http 状态码?
  • 我看到它不是 200,因此我有一个错误的请求。奇怪,因为我在他们的 api 文档中复制了确切的请求。
  • 谢谢克劳斯,它正在发送一个错误代码,在您的帮助和其他答案的帮助下,我能够缩小范围并修复它!

标签: python json python-3.x rest bitcoin


【解决方案1】:

当您调用 API 时,您的 API 调用可能会失败并仅返回字符串或空响应。我建议您首先检查您的响应的状态代码,如下所示,然后处理 json 数据。

    data = requests.post() 
    if data.status_code != 200:
        raise Exception("Error", data.reason) 
   json_data = data.json()

【讨论】:

  • 好的,仅仅改变它并没有改变输出。我调整了请求 url,添加了对 200 以外的状态代码的检查,然后我的输出更改为:文件“c:\Users\david\Desktop\Code Projects\GeminiTrader\GeminiTrader-v0.1.py”,第 34 行, 在 raise Exception("error", response.reason) Exception: ('error', 'Bad Request') 这只是意味着我的有效负载是错误的吗?我的请求无效?
  • 这就是raise_for_status() 的用途。
  • 明白了!非常感谢您的帮助,我会记得检查状态!
猜你喜欢
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多