2015-06-14 67 views
0

在我的應用程序中,我有一個用戶傳遞窗體,它觸發一個API請求,然後顯示查詢結果。通過RestClient傳遞API密鑰和參數

我允許用戶選擇很多或很少的參數。我得到的問題是401授權錯誤,我相信這是因爲apikey沒有被識別(沒有密碼,用戶名需要用於api並且沒有限制)。

應用:

post '/search' do 

    phrase = params.fetch "phrase" #mandatory 
    @delimiters = "" 

    start_date = params.fetch "start_date" 
    start_date.empty? ? start_date = "" : @delimiters << "From #{start_date}," 

    end_date = params.fetch "end_date" 
    end_date.empty? ? end_date = "" : @delimiters << "To #{end_date}" 

    api_result = RestClient::Request.execute(method: :get, url: "capitolwords.org/api/1/text.json?phrase=#{phrase} 
             &page=0&apikey=", 
             headers: {params: {:start_date => start_date, 
             :end_date => end_date}, 
             :Authorization => ENV['SUNLIGHT_API_KEY']}, 
             timeout: 10)  
end 

分隔符是我使用的是趕上這樣我就可以展示他們搜索用戶傳遞的所有參數的東西。我已閱讀https://github.com/rest-client/rest-client的文檔,他們沒有提及通過API key傳遞。

這是重構過程的一部分 - 傳遞參數作爲#{@ parameter_example}的工作原理,但會使我的代碼不易讀,然後手動設置@parameter_example =「& parameter_example =#{parameter_example} 「這似乎過於冗長。

回答

2

capitalwords.org documentation來看,似乎api keyphrasestart_dateend_date PARAMS應該爲query string.的一部分來傳遞,因此你的休息,客戶端的請求看起來應該像這樣一起:

api_result = RestClient::Request.execute(method: :get, 
              url: "capitolwords.org/api/1/text.json", 
             headers: {params: {:phrase => phrase, 
                  :start_date => start_date, 
                  :end_date => end_date, 
                  :page => 0, 
                  :apikey => ENV['SUNLIGHT_API_KEY']}}, 
             timeout: 10)  

我認爲爲了傳遞這樣的參數(使用headers params hash)到RestClient::Requeest.execute那麼你請求的URL不應該包含任何參數,否則rest-client不能產生正確的url。這就是爲什麼我將pagephrase從url轉換爲params短語散列。

+0

好的,我認爲這可能是正確的解決方案。目前它不能識別短語作爲參數。 – user3162553

+0

@ user3162553你可以這樣做來解決你的問題,用127.0.0.1:8888或localhost:8888(8888只是一個隨機的端口號,使用一個適合你的)替換:url hostname,在另一個術語上運行類似於'nc -l 8888'(nc是netcat工具)。然後執行RestClient :: Request並檢查RestClient發送給netcat的請求。 – egwspiti

+0

好吧,我發現問題 - 我只需要傳遞參數,如果不是零。它將參數傳遞給url,即使沒有任何價值,它也是&param =&param =。謝謝。 – user3162553

0

您是否記得在文件頂部執行以下操作?

require 'dotenv' 
Dotenv.load 
+0

是的,其他的API工作得很好。這是爲了重構的目的。 – user3162553