Rails实现API版本控制后,curl请求无法解析myapp.com主机问题求助
解决curl无法解析域名及API版本控制失效问题
一、先搞定域名解析失败的核心问题
你碰到的curl: (6) Couldn't resolve host 'myapp.com',本质是系统找不到myapp.com对应的服务器IP。可以用这两种方式快速解决:
修改本地hosts文件绑定域名
找到系统的/etc/hosts文件(如果是在Vagrant虚拟机里执行curl,就改虚拟机内的hosts;如果是宿主机执行,就改宿主机的),添加一行配置:127.0.0.1 myapp.com如果你的Rails服务器跑在虚拟机专属IP(比如Vagrant常用的
192.168.33.10),就把127.0.0.1换成这个IP:192.168.33.10 myapp.com保存后再执行curl命令,域名就能正常解析了。
直接用IP地址替代域名
不想改hosts的话,直接用服务器IP访问也能绕开解析问题,比如:curl -H 'Accept: application/vnd.example.v1' http://127.0.0.1:3000/api/movies_all虚拟机环境就换成对应IP:
curl -H 'Accept: application/vnd.example.v1' http://192.168.33.10:3000/api/movies_all
二、核对API版本控制的配置是否正确
解决了解析问题后,还要确保你的Rails应用版本控制逻辑没毛病,不然即使能访问,也可能路由不到对应版本的接口。给你列一下基于Accept头的版本控制常见配置,你可以对照检查:
路由层的版本约束设置
在config/routes.rb里,要给API版本加上约束逻辑:namespace :api do # 基于Accept头的版本约束 scope module: :v1, constraints: ApiVersion.new('v1', true) do resources :movies_all end end版本约束类的实现
确保你在app/constraints/api_version.rb里定义了ApiVersion类,用来识别请求头里的版本信息:class ApiVersion attr_reader :version, :default def initialize(version, default = false) @version = version @default = default end def matches?(request) check_headers(request.headers) || default end private def check_headers(headers) accept = headers[:accept] accept && accept.include?("application/vnd.example.#{version}") end end控制器的目录结构
确认你的版本控制器放在对应目录下,比如v1版本的MoviesAllController要放在app/controllers/api/v1/movies_all_controller.rb。
三、分步测试建议
- 先验证基础接口是否能访问:
(解析问题解决后,应该能拿到正常响应)curl http://myapp.com:3000/api/movies_all - 再加上Accept头测试版本控制:
这时候应该会路由到v1版本的控制器逻辑。curl -H 'Accept: application/vnd.example.v1' http://myapp.com:3000/api/movies_all
内容的提问来源于stack exchange,提问作者Siddharth Sharma
相关产品推荐
相关产品推荐

