调用IBM Cloud Function获取Cloudant数据返回空对象问题
问题排查与修复
核心问题分析
报错Expecting value: line 1 column 1 (char 0)说明客户端解析Cloud Function返回的响应时,拿到的内容不是有效的JSON(甚至是空内容)。结合代码来看,主要有两个问题:
1. Cloud Function返回不可序列化数据
原Cloud Function中直接将Cloudant的Document对象添加到列表返回,这类对象包含大量Cloudant内部属性,无法被正确序列化为标准JSON,导致返回的响应内容无效。
2. 客户端请求函数错误处理不完善
get_request函数的异常捕获逻辑过于宽泛,且未处理JSON解析失败的场景,也没有校验响应状态码,无法及时定位问题。
修复步骤
修复Cloud Function代码
修改文档收集逻辑,提取Document对象中的实际数据(存储在_data属性中),确保返回可序列化的JSON:
import json from cloudant.client import Cloudant from cloudant.error import CloudantException from cloudant.result import Result, ResultByKey def main(args): # Connect to the database client = Cloudant.iam( account_name='account_name', api_key='api_key', connect=True ) db = client['dealerships'] # Query all documents from the database documents = [] for doc in db: # 提取文档的实际业务数据,避免序列化内部对象 documents.append(doc._data) # Disconnect from the database client.disconnect() # Return the list of documents as JSON return {"entries": documents}
修复客户端get_request函数
增强错误处理,校验响应状态码,使用更可靠的JSON解析方式,并打印调试信息:
import requests import json def get_request(url, **kwargs): print(kwargs) print("GET from {} ".format(url)) try: response = requests.get( url, headers={'Content-Type': 'application/json'}, params=kwargs) # 自动校验状态码,非200系列直接抛出异常 response.raise_for_status() except requests.exceptions.RequestException as e: print(f"请求异常: {e}") return None print("响应状态码: {} ".format(response.status_code)) try: # 使用response.json()自动处理编码和解析,比手动loads更可靠 json_data = response.json() return json_data except json.JSONDecodeError as e: print(f"JSON解析失败: {e}") print(f"原始响应内容: {response.text}") return None
验证建议
- 先在IBM Cloud控制台直接测试Cloud Function,确认返回的JSON包含
entries字段,且字段内是正确的经销商文档数据。 - 重新运行客户端代码,查看调试日志,确认
json_result能正确获取到entries数据。
内容的提问来源于stack exchange,提问作者user13878929
相关产品推荐
相关产品推荐

