基于Django REST Framework的API如何按userToken筛选订单?
问题:如何通过Retrofit获取指定userToken的订单列表?
现有基于Django REST Framework的订单API,返回的订单模型包含userToken、订单日期、商品及价格,示例响应如下:
{ "userToken": "7e0e72e274bbda5e6f3cc9e3563f8c41384a37af", "date": "2023-05-14T08:11:05.689723Z", "product": [ ... ], "price": 170 }
在浏览器中,通过以下URL可正确获取指定用户的订单列表:
base_url/Order/Order/?search=7e0e72e274bbda5e6f3cc9e3563f8c41384a37af
尝试了多种Retrofit写法均未成功:
- 使用
userToken作为查询参数,返回全部订单:
@GET("Order/Order/") suspend fun getOrder(@Query("userToken") userToken:String):Response<List<OrderResult>>
- 在URL后拼接
?search=,仍返回全部订单:
@GET("Order/Order/?search=") suspend fun getOrder(@Query("userToken") userToken:String):Response<List<OrderResult>>
- 使用Path参数拼接在
search后,未获取到任何数据:
@GET("Order/Order/?search={userToken}") suspend fun getOrder(@Path("userToken") userToken:String):Response<List<OrderResult>>
解决方案
问题核心是API期望的查询参数名是search,而非userToken——Django DRF的SearchFilter默认使用search作为查询参数名执行过滤逻辑。
正确的Retrofit写法如下:
@GET("Order/Order/") suspend fun getOrder(@Query("search") userToken: String): Response<List<OrderResult>>
说明:
- 该写法会生成与浏览器完全一致的请求URL:
base_url/Order/Order/?search=xxx,其中xxx为传入的userToken值。 - Retrofit会自动将
@Query("search")指定的参数名和值拼接为正确的查询字符串,匹配API的过滤规则,从而返回指定userToken关联的订单。
内容的提问来源于stack exchange,提问作者Kring Lord
相关产品推荐
相关产品推荐

