Python中如何在API请求URL中传递多SKU重复键参数
解决多SKU参数的API请求问题
问题核心
当电商API要求在URL中传递多个同名的sku参数(如sku=XXX&sku=YYY)时,用字典存储参数会因键的唯一性导致重复值被覆盖,urllib.parse.urlencode处理字典也只会保留最后一个sku参数,无法满足API的参数要求。
解决方案
1. 利用Requests库的params参数自动处理多同名参数
Requests库的params参数支持传入值为列表的字典,会自动将列表中的每个元素转换为同名URL参数,无需手动拼接字符串,既简洁又能避免编码问题。
2. 修改get_stocks函数以支持多SKU传入
将原函数的sku参数改为接受SKU列表,同时改用Requests的params参数传递参数:
def get_stocks(self, campaign_id, warehouse_id, skus): """获取库存信息 参数: campaign_id (int): Store中的client_id warehouse_id (int): Warehouse中的warehouse_id skus (list): 商品SKU列表 返回: tuple: (是否成功, 状态信息/错误信息, 库存数据(成功时)) """ url = f"{self.url}campaigns/{campaign_id}/warehouses/{warehouse_id}/stocks/actual.json" # 通过params传递多SKU参数,Requests会自动生成sku=xxx&sku=yyy格式 req = requests.get(url, params={'sku': skus}, headers=self.headers) if req.status_code == 200: return True, '200', req.json() # 兼容API返回格式异常的情况 try: error_msg = req.json()["error"]["message"] except (KeyError, ValueError): error_msg = f"请求失败,状态码: {req.status_code}" return False, error_msg
3. 从Django Product模型获取SKU列表
如果需要从数据库中获取所有商品的SKU,可通过Django的QuerySet提取:
# 获取所有Product的SKU并转为列表 skus = list(Product.objects.values_list('sku', flat=True)) # 调用库存查询方法 success, msg, stock_data = your_api_client.get_stocks(campaign_id, warehouse_id, skus)
备选方案(手动拼接参数)
如果不想依赖Requests的自动处理,也可以用urllib.parse.urlencode处理元组列表来生成多参数的查询字符串:
from urllib.parse import urlencode # 构造元组列表,每个元素为(参数名, SKU值) params = [('sku', sku) for sku in skus] query_string = urlencode(params) # 拼接完整URL full_url = f"{url}?{query_string}" req = requests.get(full_url, headers=self.headers)
注意事项
- 若API要求使用POST方法且参数需放在URL中,只需将
requests.get改为requests.post,params参数的用法保持不变; - 若POST参数需放在请求体中,请根据API要求选择
form-data或json格式传递,此时无需在URL中拼接参数。
内容的提问来源于stack exchange,提问作者Iren E
相关产品推荐
相关产品推荐

