You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Robinhood Crypto API取消限价单JSON解码错误求助

Robinhood Crypto API cancel_order JSONDecodeError 排查与解决

核心问题分析

你遇到的JSONDecodeError: Expecting value: line 1 column 1 (char 0),本质是POST请求返回了空响应体,但代码强制尝试解析为JSON。尽管状态码返回200,但Robinhood Crypto API在成功取消限价单时可能返回空内容而非标准JSON响应,导致解析失败。

可能原因与解决方法

1. 强制解析空响应

问题

你的cancel_order函数可能直接调用response.json(),没有检查响应体是否为空。当API返回空内容时,JSON解析器就会抛出该错误。

修复代码

修改取消订单逻辑,先判断响应内容是否存在再解析:

from requests.exceptions import JSONDecodeError

def cancel_order(self, order_id):
    cancel_url = f"{self.base_url}/crypto/orders/{order_id}/cancel"  # 确保端点路径正确
    response = self.session.post(cancel_url)
    response.raise_for_status()  # 确保状态码为2xx
    
    # 处理空响应情况
    try:
        return response.json()
    except JSONDecodeError:
        # 空响应视为取消成功,返回自定义状态
        return {"status": "success", "order_id": order_id, "message": "Order canceled successfully (empty API response)"}

2. 请求头/参数不匹配

问题

cancel_order的POST请求头可能和正常工作的place_order不一致,比如缺少Content-Type、授权令牌或API版本头,导致API返回非预期的空响应。

修复

确保session的请求头与place_order完全一致,比如:

# 初始化session时设置统一头信息(和place_order用的一样)
self.session.headers.update({
    "Authorization": f"Bearer {self.auth_token}",
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Robinhood-API-Version": "1.0.0"  # 根据实际API版本调整
})

部分API要求取消订单的POST请求携带空的JSON body,可添加json={}参数:

response = self.session.post(cancel_url, json={})

3. 订单状态无法取消

问题

如果目标订单已经是已成交、已取消、已过期状态,调用取消接口时API可能返回空响应,状态码仍为200。

修复

取消前先校验订单状态,仅对可取消的订单执行操作:

def cancel_order(self, order_id):
    # 先获取订单详情
    order_details = self.get_orders(order_id)
    valid_states = ["queued", "unfilled", "partially_filled"]
    if order_details["state"] not in valid_states:
        return {"status": "error", "message": f"Order {order_id} is in {order_details['state']} state, cannot cancel"}
    
    # 执行取消逻辑
    cancel_url = f"{self.base_url}/crypto/orders/{order_id}/cancel"
    response = self.session.post(cancel_url, json={})
    response.raise_for_status()
    
    try:
        return response.json()
    except JSONDecodeError:
        return {"status": "success", "message": "Order canceled"}

4. API端点路径错误

问题

你使用的取消订单端点路径可能不正确(比如混淆了股票API和加密货币API的路径),导致API返回空响应。Robinhood Crypto的订单端点通常带有/crypto/前缀。

修复

核对官方API的取消订单端点,确保路径为:

https://api.robinhood.com/crypto/orders/{order_id}/cancel/

内容的提问来源于stack exchange,提问作者Sutton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 13:33:19