Я использую Ruby on Rails и Kibana для отображения визуализации на моем веб-сайте (Ruby2.6.0, Rails5.2.3, Kibana6.6.1). Используя Xpack-> Share-> Generate PDF / PNG, я нахожу 'copy POST url'. Я могу получить следующий JSON-файл из URL-адреса POST с помощью 'net / http', но как я могу использовать POST-URL / JSON-файл на моем веб-сайте RoR для загрузки PNG-файла в папку 'assets'?
JSON-файл, полученный с URL-адреса POST:
{'path': '/ api / reports / jobs / download / jvds4zs10qv79d0062b9cel6',
'job': {'id': 'jvds4zs10qv79d0062b9cel6', 'index':
'.reporting-2019.05.05', 'type': 'esqueue', 'jobtype': 'PNG',
'create_by': False, 'payload': {'type': 'visualization', 'title':
'[eCommerce] Sales by Gender','lativeUrl ':
«/ Приложение / kibana # / визуализации / редактирования / ed8436b0-b88b-11e8-a6d9-e546fe2bba5f _g = (RefreshInterval: (пауза: т, значение: 0), время: (от: теперь-60d, режим: быстрый, чтобы: сейчас)) & _ а = (фильтры: (), связаны между собой:! е, запрос: (язык: Lucene, запрос: ''), uiState :(), визави: (Aggs: ((включено: т, ID: '1', Params :(), схема: метрика, тип: число), (включено: т, идентификатор: '2', Титулы: (поле: customer_gender, JSON: '', missingBucket: е, missingBucketLabel : Отсутствует, заказ: убывание, OrderBy: '1', otherBucket: е, otherBucketLabel: Другое, размер: 5), схема: сегмент, тип: условия)), Титулы: (addLegend: т, addTooltip: т, isDonut: т, метки: (last_level: т, показать: т, усечение: 100, значения: т), legendPosition: правый, тип: пирог), название: "% 5BeCommerce% 5D + продаж + на + Пол », тип: пирог))»,
«заголовки»:
'UxY4w6gCRwwLZyFkDX0ujVlANYq7ae5UuNJAN0GpbTOX7vw5aPuCuyr37nNcpz3vtA8kNVaL6Gacs24mPjZfwl4mB9xRKGA62CkCLo8Xz1amuIEthI + BtKPGo5QAk2k2 + 7zLvLgX3KouVvYdd61U5rLAvfjv4TydcpH9qJ4qrL5OELkzAJGrNdujtDLWaoy2Qj9YXbLnh7gSdI + lrNml6usZIh4pMzz8qdRo597iO / 4AeSJRa2JfAruyGB3zYInZRtMuCbA4f3ANvT2WeAn6lpiwThB993uEjwu4LBVUZuo2XL0TcB29YNNa9oMCUEhWjdJ1ase5VQdz8V2IOgecQ1W52V5JuVTvl9SkVvFWSBhXJg ==',
'browserTimezone': 'Европа / Цюрих', 'макет': {'размеры':
{'height': 589.234375, 'width': 866}}, 'basePath': '', 'forceNow':
«2019-05-07T12: 38: 12.768Z»}, «тайм-аут»: 120000, «max_attempts»: 3,
'priority': 10, 'browser_type': 'chromium'}}
Я пытаюсь использовать 'net/http'
, что я добавил в контроллер:
class MaisonController < ApplicationController
require 'net/http'
def require_post
uri = URI.parse("http://localhost:5601/api/reporting/generate/png?jobParams=(browserTimezone:Europe%2FZurich,layout:(dimensions:(height:589.234375,width:866)),objectType:visualization,relativeUrl:%27%2Fapp%2Fkibana%23%2Fvisualize%2Fedit%2Fed8436b0-b88b-11e8-a6d9-e546fe2bba5f%3F_g%3D(refreshInterval:(pause:!!t,value:0),time:(from:now-60d,mode:quick,to:now))%26_a%3D(filters:!!(),linked:!!f,query:(language:lucene,query:!%27!%27),uiState:(),vis:(aggs:!!((enabled:!!t,id:!%271!%27,params:(),schema:metric,type:count),(enabled:!!t,id:!%272!%27,params:(field:customer_gender,json:!%27!%27,missingBucket:!!f,missingBucketLabel:Missing,order:desc,orderBy:!%271!%27,otherBucket:!!f,otherBucketLabel:Other,size:5),schema:segment,type:terms)),params:(addLegend:!!t,addTooltip:!!t,isDonut:!!t,labels:(last_level:!!t,show:!!t,truncate:100,values:!!t),legendPosition:right,type:pie),title:!%27%255BeCommerce%255D%2BSales%2Bby%2BGender!%27,type:pie))%27,title:%27%5BeCommerce%5D%20Sales%20by%20Gender%27)")
http = Net::HTTP.new(uri.host,uri.port)
request = Net::HTTP::Post.new(uri.request_uri)
response = http.request(request)
render :json => response.body
end
end
Edit:
Я пытаюсь использовать 'attachment_fu'
gem для загрузки png-файла с вышеуказанным JSON-файлом. Измените код в контроллере на следующий код:
класс MaisonController
require 'net/http'
require 'open-uri'
def require_post
uri = URI.parse("http://localhost:5601/api/reporting/generate/png?jobParams=(browserTimezone:Europe%2FZurich,layout:(dimensions:(height:589.234375,width:866)),objectType:visualization,relativeUrl:%27%2Fapp%2Fkibana%23%2Fvisualize%2Fedit%2Fed8436b0-b88b-11e8-a6d9-e546fe2bba5f%3F_g%3D(refreshInterval:(pause:!!t,value:0),time:(from:now-60d,mode:quick,to:now))%26_a%3D(filters:!!(),linked:!!f,query:(language:lucene,query:!%27!%27),uiState:(),vis:(aggs:!!((enabled:!!t,id:!%271!%27,params:(),schema:metric,type:count),(enabled:!!t,id:!%272!%27,params:(field:customer_gender,json:!%27!%27,missingBucket:!!f,missingBucketLabel:Missing,order:desc,orderBy:!%271!%27,otherBucket:!!f,otherBucketLabel:Other,size:5),schema:segment,type:terms)),params:(addLegend:!!t,addTooltip:!!t,isDonut:!!t,labels:(last_level:!!t,show:!!t,truncate:100,values:!!t),legendPosition:right,type:pie),title:!%27%255BeCommerce%255D%2BSales%2Bby%2BGender!%27,type:pie))%27,title:%27%5BeCommerce%5D%20Sales%20by%20Gender%27)")
http = Net::HTTP.new(uri.host,uri.port)
request = Net::HTTP::Post.new(uri.request_uri)
response = http.request(request)
render :json => response.body
http.start() { |http|
tempfile = Tempfile.new('test.png')
File.open(tempfile.path, 'w') do |f|
f.write response.body
end
attachment = Attachment.new(:upload_data => LocalFile.new(tempfile.path))
attachment.save
}
end
Я получаю ошибку 'uninitialized constant MaisonController::Attachment'
.
Ожидаемый результат: загрузите файл png в ресурсы, используя вышеуказанный файл JSON.