Hasura GraphQL使用动态变量做字符串搜索转REST接口问题求助
解决方案
1. 修正GraphQL查询模板
你需要把模糊匹配的%拼接逻辑、空值兼容逻辑直接写到查询内,不要在调用URL里处理,修正后的查询如下:
query MyQuery( $category_title: String = null, $search_title: String = null, $offset: Int = 0, $limit: Int = 10 ) { products( order_by: {created_at: desc}, where: { _and: [ # 分类过滤:参数为空时自动跳过该条件 { _or: [ { category_title: { _ilike: "%" || $category_title || "%" } }, { $category_title: { _is_null: true } } ] }, # 搜索过滤:参数为空时自动跳过该条件,同时匹配标题+描述 { _or: [ { title: { _ilike: "%" || $search_title || "%" } }, { description: { _ilike: "%" || $search_title || "%" } }, { $search_title: { _is_null: true } } ] } ] }, offset: $offset, limit: $limit ) { id available category_title description title sku images(where: {related_type: {_eq: "products"}}) { id file { id url } } variant_object: components(where: {field: {_eq: "variants"}}) { variant { id quantity sku title price: components(where: {field: {_eq: "price"}}) { money { amount currency id precision } } } } } }
这里做了3处核心调整:
- 给所有变量设置了默认值
null,参数未传时自动生效 - 用
"%" || $变量 || "%"直接在查询内完成模糊匹配符拼接,无需调用方处理 - 每个过滤条件都加了
变量是null则跳过的逻辑,实现空值兼容
2. 配置REST端点
不要用路径参数传搜索值,路径参数无法友好传递空值,直接用查询参数配置端点即可:
- 端点路径设置为
/api/rest/products - 在Hasura的REST端点配置页,会自动识别你查询里的4个变量,不需要手动绑定路径参数,保持默认配置即可
3. 正确调用方式
直接传原始参数值即可,不需要加%也不需要写变量占位符:
- 全量查询(不限制分类、不搜索关键词):
https://xxxxx.hasura.app/api/rest/products?offset=0&limit=10 - 仅搜索关键词为“耳机”:
https://xxxxx.hasura.app/api/rest/products?search_title=耳机&offset=0&limit=10 - 仅筛选分类为“数码配件”:
https://xxxxx.hasura.app/api/rest/products?category_title=数码配件&offset=0&limit=10 - 同时筛选分类+搜索关键词:
https://xxxxx.hasura.app/api/rest/products?category_title=数码配件&search_title=耳机&offset=0&limit=10
错误原因说明
你之前的写法有两个核心问题:
- 把
%和变量占位符$category_title直接写到了调用URL的参数值里,Hasura无法识别这种混合写法,会直接把整个字符串当成查询值,要么匹配不到结果,要么因为特殊字符解析失败报500错误 - 路径参数传递空值会导致URL格式错误,无法被正常解析
内容的提问来源于stack exchange,提问作者Ako Si
相关产品推荐
相关产品推荐

