在 Rails 开发环境中,我尝试添加一个 Sinatra 应用程序作为中间件。Sinatra 应用程序使用geoip gem来处理用户的 IP 地址并返回他们所在城市的 json。
我可以通过在浏览器中直接访问示例 url 或在命令行中使用 curl 来查看返回的 json http://local.fqdn.org/geoip/locate.json?ip=24.18.211.123
,. 但是,当我尝试从 Rails 控制器中使用 wget 调用 url 时,Rails 应用程序停止响应,经常使我的浏览器崩溃,并且我的 Rails 服务器不会使用 control+C 命令退出。
关于这里发生了什么的任何线索?为什么直接访问浏览器中的 url 会返回正确的响应,但我在控制器中的调用会导致超时?
sinatra-geoip.rb
require 'sinatra'
require 'geoip'
require 'json'
# http://localhost/geoip/locate.json?ip=24.18.211.123
#
# {
# latitude: 47.684700012207
# country_name: "United States"
# area_code: 206
# city: "Seattle"
# region: "WA"
# longitude: -122.384803771973
# postal_code: "98117"
# country_code3: "USA"
# country_code: "US"
# dma_code: 819
# }
class GeoIPServer < Sinatra::Base
get '/geoip/locate.json' do
c = GeoIP.new('/var/www/mywebsite.org/current/GeoLiteCity.dat').city(params[:ip])
body c.to_h.to_json
end
end
路线.rb
mount GeoIPServer => "/geoip"
配置/环境/development.rb
Website::Application.configure do
require "sinatra-geoip"
config.middleware.use "GeoIPServer"
...
end
控制器
raw_geo_ip = Net::HTTP.get(URI.parse("http://#{geoip_server}/geoip/locate.json?ip=#{request.ip}"))
@geo_ip = JSON.parse(raw_geo_ip)