Phoenix框架Plug控制器函数子句匹配失败问题求助
问题根源
你遇到的Phoenix.ActionClauseError是因为GET请求的请求体不会被Phoenix解析。你在请求里发了JSON格式的id,但Phoenix默认只会解析GET请求的URL查询参数,不会处理请求体内容,所以控制器函数get_founds/2的第二个参数里根本没有"id"键,自然匹配不到你定义的%{"id" => id}模式。
解决方案
有两种可行的修复方式,按需选择:
方式1:改用POST请求传递JSON参数
既然要传JSON格式的参数,更符合HTTP规范的做法是用POST请求:
- 修改路由,把
get "/get_founds", UserAtmController, :get_founds改为post "/get_founds", UserAtmController, :get_founds - 请求时使用
POST /api/get_founds,保留原有的JSON请求体即可,Phoenix会自动解析请求体中的参数,控制器函数就能匹配到%{"id" => id}了。
方式2:将id作为URL查询参数传递
如果必须使用GET请求,把id放到URL的查询参数里:
- 保持路由的
get配置不变 - 请求地址改为
GET /api/get_founds?id=2,无需发送JSON请求体 - 控制器函数无需修改,Phoenix会将查询参数解析到
params中,%{"id" => id}能正常匹配。
补充说明
HTTP规范建议GET请求不要携带请求体,大部分服务器和框架(包括Phoenix)对GET请求的请求体处理都有特殊限制,遵循规范设计接口能避免这类问题。
内容的提问来源于stack exchange,提问作者Luis Marquez
相关产品推荐
相关产品推荐

