2014-07-02 57 views
1

我熟悉API。首先,我使用Forecast APIRails读取API响应标题

在文档中,您会找到一个标题为“响应标题”的小节。他们是什么,我如何使用它们?

此外,为了得到回应,它说你需要传递一个API密钥以及经纬度和长数据。但是API密钥不应该被保密吗?任何人都可以找出请求的内容吗?

这是我的代码:

预测模型

require 'json' 
class Forecast 
    include HTTParty 
    debug_output $stdout 
    default_params :apiKey => 'xxxxxxxxxxxxxxxxxxxxxxxxx' 
    base_uri "api.forecast.io" 
    format :json 

    def self.get_weather(api,lat,long) 
    @response = get("/forecast/#{apiKey}/#{lat},#{long}") 
    end 

    def self.show_weather 
    JSON.parse(@response.body) 
    end 

end 

预测控制器

def index 
    @weather = Forecast.get_weather("28.5355", "77.3910") 
    @response = Forecast.show_weather 
end 

预测视图

<%= @response["currently"]["summary"] %> 
+1

'default_params'会将参数添加到URL中 - 在这种情况下,您的网址将以'?apiKey = abcde'结尾。在'self.get_weather'中,'apiKey'将是未定义的。 –

回答

1

你在这里问几个不同的问题。

  • 响应头:它们是HTTP响应的一部分,并且包含关于响应信息。例如,他们可能会告诉你响应的MIME类型 - 例如。 Content-Type: application/json。在这种情况下,Forecast会使用它来告诉您有多少个API调用(X-Forecast-API-Calls),以及他们需要多长时间回复(X-Response-Time)以及一些缓存信息。

  • API密钥:是的,这些应该保密。 Forecast API可以通过HTTPS工作,因此(理论上)您的API密钥应该保密,以防止人们嗅探网络上的流量。主要的危险在于将其保存在代码中,例如将其提交给GitHub。你应该找出一种安全的方式来存储API密钥。一个例子虽然不完美,但将其作为一个环境变量。

我希望有帮助。

+0

如何访问这些标题数据。我做了'JSON.parse(@ response.headers)',并没有奏效。 – arjun

+0

响应标题不会是JSON,而是哈希。所以你可以这样做:'@ response.headers ['X-Response-Time']'。要看到整个事情,请尝试打印'@ response.headers'或'@ response.headers.inspect'。 –

+0

谢谢。还有一件事关于API密钥。因为我在控制器中设置密钥,所以我怎样才能在模型中设置它(然后在env文件中),并将其包含在get参数中(请参阅更新后的问题,它具有default_params)。简单地调用'#{apiKey}'无效。 – arjun