【问题标题】:How to pass payload for elastic search aws post request in Ruby如何在Ruby中为弹性搜索aws post请求传递有效负载
【发布时间】:2018-10-13 18:10:14
【问题描述】:

我正在尝试获取特定索引的记录,每次调用我可以获得默认的 10 条记录。

但是,我也想传递额外的正文参数,以便对记录进行一些过滤和限制。

关注this链接后, 这是我正在使用的代码,

    body = '{size:100}'
    payload_hash = OpenSSL::Digest.new("sha256").hexdigest(body)

    url = "https://myhost/index_name/_search"
    signer = Aws::Sigv4::Signer.new(
      service: 'es',
      region: 'us-west-1',
      access_key_id: 'access_key',
      secret_access_key: 'secret_key'
    )

    uri
     = URI(url)

    t = Time.now.utc
    amzdate = t.strftime('%Y%m%dT%H%M%SZ')
    datestamp = t.strftime('%Y%m%d')

    headers = {
      "host"=>'myhost',
      "x-amz-date" => amzdate,
      "x-amz-content-sha256" => body
    }

    signature = signer.sign_request(
      http_method: 'POST',
      url: url,
      headers: headers,
      body: body
    )


    require 'uri'
    require 'net/http'

    url = URI("https://myhost/index_name/_search")

    http = Net::HTTP.new(url.host, url.port)
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE

    request = Net::HTTP::Post.new(url, 'size' => '100'})
    request["host"] = signature.headers['host']
    request["x-amz-content-sha256"] = signature.headers['x-amz-content-sha256']
    request["x-amz-date"] = signature.headers['x-amz-date']
    request["authorization"] = signature.headers["authorization"]
    response = http.request(request)
    result =  response.read_body
    result = JSON.parse(result)
    result["hits"]["hits"].count

我总是只获得 10 条记录。 我也阅读了很多关于 net http 的文档。不知道我在这里做错了什么。

【问题讨论】:

    标签: ruby amazon-web-services elasticsearch aws4c


    【解决方案1】:

    我只是想出了解决方案,将其发布在下面以供将来查询

    我正在根据请求添加正文,例如 request['body'],它将其设置为标题。 正确的方法是将json body传递给签名hash并设置请求对象的body方法。

        body = {"size": 1000}
        payload_hash = OpenSSL::Digest.new("sha256").hexdigest(body)
    
        url = "https://my-host/my-index/_search"
        signer = Aws::Sigv4::Signer.new(
          service: 'es',
          region: 'us-west-1',
          access_key_id: 'accesss_key',
          secret_access_key: 'secret_key',
          apply_checksum_header: false
        )
    
        uri
         = URI(url)
    
        t = Time.now.utc
        amzdate = t.strftime('%Y%m%dT%H%M%SZ')
        datestamp = t.strftime('%Y%m%d')
    
        headers = {
          "host"=>'my-host',
          "x-amz-date" => amzdate
        }
    
        signature = signer.sign_request(
          http_method: 'POST',
          url: url,
          headers: headers,
          body: body.to_json
        )
    
    
        require 'uri'
        require 'net/http'
    
        url = URI("https://my-host/my-index/_search")
    
        http = Net::HTTP.new(url.host, url.port)
        http.use_ssl = true
        http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    
        request = Net::HTTP::Post.new(url)
        request["host"] = signature.headers['host']
        request["x-amz-date"] = signature.headers['x-amz-date']
        request["authorization"] = signature.headers["authorization"]
        request.body = body.to_json
        response = http.request(request)
        result =  response.read_body
        result = JSON.parse(result)
        result["hits"]["hits"].count
    

    【讨论】:

      猜你喜欢
      • 2018-03-19
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多