如何用Retrofit实现带动态参数的Strapi GET过滤请求?
解决Strapi API动态过滤EditText输入内容的问题
问题说明
基于Strapi构建GET API实现数据过滤,使用$containsi做不区分大小写的包含匹配,需要将请求中硬编码的"Forest"替换为EditText的动态输入值。
解决步骤
1. 修正Retrofit接口的参数注解
原代码中使用@Path注解是错误的,因为name是查询参数而非路径参数。应改用@Query注解传递动态过滤值,调整后的接口代码如下:
@GET("destinations?populate=*") fun getSearchList(@Query("filters[name][\$containsi]") name: String): Call<ResponseDestination>
或者保留原URL的占位符写法,同步替换注解:
@GET("destinations?populate=*&filters[name][\$containsi]={name}") fun getSearchList(@Query("name") name: String): Call<ResponseDestination>
2. 动态传入EditText的输入值
注意不要在页面初始化时直接获取EditText文本(此时为空),应在用户触发搜索动作(比如点击搜索按钮)时获取输入值并调用API。修改后的Activity代码:
// 绑定搜索按钮与EditText val searchBtn = view.findViewById<Button>(R.id.btn_search) val etText = view.findViewById<EditText>(R.id.et_text) searchBtn.setOnClickListener { val inputText = etText.text.toString().trim() if (inputText.isNotEmpty()) { ApiConfigDestionation.getService().getSearchList(inputText).enqueue(object : Callback<ResponseDestination> { @SuppressLint("NotifyDataSetChanged") override fun onResponse(call: Call<ResponseDestination>, response: Response<ResponseDestination>) { val responseBody = response.body() val responseList = responseBody?.data val searchAdapter = ListAllAdapter(responseList) rv_destination.apply { layoutManager = LinearLayoutManager(context) setHasFixedSize(true) adapter = searchAdapter } } override fun onFailure(call: Call<ResponseDestination>, t: Throwable) { Toast.makeText(context, t.localizedMessage, Toast.LENGTH_SHORT).show() } }) } else { Toast.makeText(context, "请输入搜索内容", Toast.LENGTH_SHORT).show() } } return view
关键说明
根据Strapi官方文档(REST API过滤章节):
$containsi用于执行不区分大小写的包含匹配,请求格式为GET /api/[集合名]?filters[字段名][$containsi]=匹配值。在Retrofit中,这类查询参数需要用@Query注解传递动态值,而非@Path(@Path仅用于替换URL路径中的占位符,比如/users/{id}中的id)。
内容的提问来源于stack exchange,提问作者Chishiya
相关产品推荐
相关产品推荐

