2015-06-14 9 views
0

В моем приложении у меня есть пользовательский проход в форме, которая запускает запрос API, а затем отображает результаты запроса.Передача ключа API и параметров с RestClient

Я разрешаю пользователю выбирать многие или несколько параметров. Проблема, которую я получаю, - ошибка авторизации 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.

Это часть процесса рефакторинга - проходя по параметрам по одному, как # {@} parameter_example работает, но делает мой код менее читаемым и я вручную необходимо настроить @parameter_example = "& parameter_example = # {} parameter_example «что кажется слишком многословным.

ответ

2

Судя по capitalwords.org documentation, кажется, что api key вместе с phrase, start_date, end_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)  

I подумайте, что для того, чтобы передать такие параметры (используя хэши paramers params) в RestClient::Requeest.execute, тогда URL-адрес, который вы запрашиваете, не должен содержать никаких параметров, иначе rest-client не сможет создать правильный URL-адрес. Вот почему я переместил page и phrase с url в хэш-код params.

+0

ОК, я думаю, это может быть правильным решением. На данный момент он не распознает фразу как параметр. – user3162553

+0

@ user3162553 Вы можете сделать что-то подобное для устранения неполадки, замените: url hostname на 127.0.0.1:8888 или localhost: 8888 (8888 - это просто случайный номер порта, используйте тот, который вам подходит), а на другом терминах запускайте что-то вроде 'nc -l 8888' (nc - инструмент netcat). Затем выполните ваш RestClient :: Request и проверьте, какой запрос RestClient отправляет netcat. – egwspiti

+0

ОК, я нашел проблему - мне нужно передавать параметры только в том случае, если они не ноль. Он передает params в url как & param = & param =, даже если нет значения. Благодарю. – user3162553

0

Вы забыли сделать следующее в верхней части файла?

require 'dotenv' 
Dotenv.load 
+0

Да, другие API работают отлично. Это предназначено для целей рефакторинга. – user3162553

Смежные вопросы