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
相关产品推荐
相关产品推荐

