2015-10-29 94 views
0

我的應用往往需要與第三方API,並使用大量的數據從響應,管理平臺是其中之一。(也許會使用3〜4 3日API) 我試圖用的Net :: HTTP,例如:rails與第三方API交互?

我的控制器:

class ApplicationController < ActionController::Base 
    protect_from_forgery with: :exception 

    def get_request (request) 
    uri = URI.parse(request) 
    res = Net::HTTP.get_response(uri) 
    end 
end 

require 'net/http' 
class LogsController < ApplicationController 
    def new 
     redmine_api_key = 'key=' + 'my key' 
     redmine_api_url = 'http://redmine/users/1.json?' 
     request_user = redmine_api_url + redmine_api_key 
     @user_get = get_request(request_user) 
     @user_data = JSON.parse(@user_get.body)['user'] 
    end 
end 

我的觀點:(只是測試,以顯示我得到了什麼)

<div class="container-fluid"> 

    <h1>Account data</h1> 

    <%= @user_data %><br> 

    <%= @user_get.code %><br> 
    <%= @user_get.message %><br> 
    <%= @user_get.class.name %><br> 

    <div class="table-responsive"> 
    <table class="table"> 
     <thead> 
     <th>ID</th> 
     <th>login</th> 
     <th>firstname</th> 
     <th>lastname</th> 
     <th>mail</th> 
     <th>created_on</th> 
     <th>last_login_on</th> 
     <th>api_key</th> 
     </thead> 
     <tbody> 
      <tr> 
      <td><%= @user_data['id'] %></td> 
      <td><%= @user_data['login'] %></td> 
      <td><%= @user_data['firstname'] %></td> 

      <td><%= @user_data['custom_fields'][0]['id'] %></td> 
      </tr> 
     </tbody> 
    </table> 
    </div> 
</div> 

我可以得到我想要的數據,但我不知道我的方法是對的還是愚蠢的(我的意思是一些代碼,如JSON.parse(@ user_get.body)['user'])。我做了一些研究,在一些文章中,他們說:如果app使用多個API,在中寫入lib文件夾是更好的方法。 還有一些機構建議:從第三方API獲取所有數據,並使用創建自己的DB來管理數據。 但我找不到有關如何使用第三方API的完整教程...

回答

1

因爲您可能需要經常對第三方進行API調用。您可以在lib文件夾中編寫該代碼。 在Api.rb

module Api 

def self.do_get_request(url, params={}) 
    request = request + '?' + params.to_query 
    uri = URI.parse(request) 
    response = Net::HTTP.get_response(uri) 
    JSON.parse(response) if response 
end 

現在你控制器,你可以調用這個函數:

require 'net/http' 
class LogsController < ApplicationController 
    def new 
     params = {key: 'my key'} 
     redmine_api_url = 'http://redmine/users/1.json' 
     response = Api.do_get_request(redmine_api_url, params) 
     @user_data = response['user'] if response.present? 
    end 
end 

do_get_request可以是一般的功能。您還可以在lib中的API模塊中創建第三方特定功能,那麼您不必在每個請求結束時添加密鑰。 無論是什麼響應,您總是會使用JSON.parse解析它,因此可以將代碼推送到Api模塊。

如果您經常使用這些數據,您可以將其存儲在數據庫中。爲此,你將不得不創建一個模型(閱讀導軌指南:http://guides.rubyonrails.org/getting_started.html)。

+0

非常感謝!感謝您的建議,我會更認真地學習文檔。 – John