Python中出现TypeError: string indices must be integers错误求助
解决ThousandEyes API调用中的TypeError: string indices must be integers错误
这个错误很常见,本质是你尝试把字符串当成字典来用了——比如你可能写了类似response['some_key']的代码,但此时response还是API返回的原始JSON字符串,不是Python字典,所以会触发"字符串索引必须是整数"的报错。
结合你的代码,我整理了两种修复方案,推荐用更简洁的requests库,也可以修复你原本的urllib2代码:
方案一:用requests库(推荐,代码更简洁)
requests会帮你处理很多细节,比如认证、代理和JSON解析,减少出错概率:
import requests import sys # 代理配置 proxies = { 'https': 'http://proxy.wdf.sap.corp:8080' } # API认证信息 username = 'xxx@xxx.com' password = 'xxxxxxxxxxxxxxxxxxx' # 你的API令牌/密码 THOUSANDEYES_API_URL = 'https://api.thousandeyes.com/v6/usage.json' try: # 发送带认证和代理的GET请求 response = requests.get(THOUSANDEYES_API_URL, auth=(username, password), proxies=proxies) # 检查请求是否成功(如果HTTP状态码是4xx/5xx会抛出异常) response.raise_for_status() # 关键步骤:把响应解析为Python字典 data = response.json() # 现在可以正常通过键访问数据了 print("获取到的使用数据:", data['usage']) except requests.exceptions.RequestException as e: print(f"请求过程出错: {str(e)}") sys.exit(1)
方案二:修复你的urllib2代码
如果一定要用urllib2,需要补全认证头和JSON解析的步骤:
import urllib2 import base64 import json import sys # 代理设置 proxy = urllib2.ProxyHandler({'https': 'http://proxy.wdf.sap.corp:8080'}) opener = urllib2.build_opener(proxy) urllib2.install_opener(opener) username = 'xxx@xxx.com' password = 'xxxxxxxxxxxxxxxxxxx' THOUSANDEYES_API_URL = 'https://api.thousandeyes.com/v6/usage.json' # 构建Basic认证的请求头 auth_str = base64.b64encode(f"{username}:{password}".encode('utf-8')).decode('utf-8') headers = {'Authorization': f'Basic {auth_str}'} try: request = urllib2.Request(THOUSANDEYES_API_URL, headers=headers) response = urllib2.urlopen(request) # 读取响应内容并解析为JSON字典(这步是解决错误的核心) raw_response = response.read().decode('utf-8') data = json.loads(raw_response) # 正常访问字典数据 print("获取到的使用数据:", data['usage']) except urllib2.URLError as e: print(f"请求出错: {str(e)}") sys.exit(1) except ValueError as e: print(f"JSON解析失败: {str(e)}") sys.exit(1)
关键修复点说明
- 必须解析JSON响应:API返回的是纯文本格式的JSON字符串,必须用
json.loads()(urllib2)或response.json()(requests)转换成Python字典,之后才能用键索引(比如data['usage'])访问内容,否则直接操作字符串就会触发你遇到的错误。 - 认证头的正确配置:ThousandEyes API需要Basic认证,
urllib2需要手动构建Base64编码的认证头,而requests可以直接通过auth参数自动处理。 - 避免混合库使用:你的代码里同时导入了
requests和urllib2,但只用到了urllib2,建议统一用一个库,减少逻辑混乱。
内容的提问来源于stack exchange,提问作者Sunil Kumar
相关产品推荐
相关产品推荐

