передача данных json в запрос на получение запроса elasticsearch с использованием драгоценного камня rest-client ruby

Как мне выполнить приведенный ниже запрос (данный в doc ) с помощью остальных клиентов.

curl -XGET 'http://localhost:9200/twitter/tweet/_search' -d '{
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}
'

Я пытался сделать это:

q = '{
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}
'

r = JSON.parse(RestClient.get('http://localhost:9200/twitter/tweet/_search', q))

Это выдало ошибку:

in `process_url_params': undefined method `delete_if' for #<String:0x8b12e18>     (NoMethodError)
    from /home/socialapps/.rvm/gems/ruby-1.9.3-p194/gems/rest-client-1.6.7/lib/restclient/request.rb:40:in `initialize'
    from /home/socialapps/.rvm/gems/ruby-1.9.3-p194/gems/rest-client-1.6.7/lib/restclient/request.rb:33:in `new'
    from /home/socialapps/.rvm/gems/ruby-1.9.3-p194/gems/rest-client-1.6.7/lib/restclient/request.rb:33:in `execute'
    from /home/socialapps/.rvm/gems/ruby-1.9.3-p194/gems/rest-client-1.6.7/lib/restclient.rb:68:in `get'
    from get_check2.rb:12:in `<main>'

Когда я делаю то же самое, используя RestClient.post, это дает мне правильные результаты!. Но документ elasticsearch использует XGET в команде curl для поискового запроса, а не XPOST. Как заставить метод RestClient.get работать?

Если есть альтернативные/лучшие способы выполнения этого действия, предложите.


person mansk    schedule 20.10.2012    source источник
comment
я думаю, что это не имеет ничего общего с получением или публикацией, а с кодом, который у вас есть в get_check2.rb. каков фактический ответ, который вы получаете от ES, используя RestClient? это, вероятно, что-то, что вы обрабатываете неправильно!   -  person phoet    schedule 20.10.2012
comment
Запросы Elasticsearch работают нормально, даже если вы используете POST-запрос. Таким образом, мы можем использовать простой клиент отдыха.   -  person Rajind Ruparathna    schedule 21.12.2016


Ответы (2)


RestClient не может отправлять тела запросов с помощью GET. У вас есть два варианта:

Передайте свой запрос как параметр source URL:

require 'rest_client'
require 'json'

# RestClient.log=STDOUT # Optionally turn on logging

q = '{
    "query" : { "term" : { "user" : "kimchy" } }
}
'
r = JSON.parse \
      RestClient.get( 'http://localhost:9200/twitter/tweet/_search',
                      params: { source: q } )

puts r

...или просто используйте POST.


ОБНОВЛЕНИЕ: исправлена ​​неправильная передача параметра URL, обратите внимание на хэш params.

person karmi    schedule 20.10.2012
comment
Coffescript, похоже, тоже не поддерживает GET Bodies. - person EnabrenTane; 14.11.2012

В случае, если кто-нибудь еще найдет это. ВОЗМОЖНО, хотя и не рекомендуется, отправлять тело запроса с помощью GET, используя внутренний метод запроса, который основной API использует для создания своих вызовов.

RestClient::Request.execute( method: :get, 
                             url: 'http://localhost:9200/twitter/tweet/_search',
                             payload: {source: q} )

См. здесь для более подробной информации.

person Mrjaco12    schedule 31.08.2014