...
Прокси-контроллер служит прослойкой между внешней системой и виджетом отчета HCCP. Он проверяет параметры, переданные из виджета, и передает их в бэкенд HCCP, добавляя к ним заголовок аутентификации и другие данные, необходимые для работы стыковки.
Для логина (POST /login
) необходимо реализовать метод, который будет передавать учетные данные в API HCCP. Пример реализации на Ruby:
Code Block | ||
---|---|---|
| ||
def login request_params = { url: URI.join(config.url, '/api/login').to_s, method: :post, payload: { params: { login: config.login, password: config.password } }.to_json } render json: RestClient::Request.execute(request_params) end |
В результате метод должен вернуть фронтэнду полученный от API HCCP json.
Для остальных запросов GET
запросов запросов запросов необходимо просто проксировать запросы. Для POST
запросов необходимо добавлять hccp_auth_token
. Пример прокси контроллера:
Code Block | ||
---|---|---|
| ||
around_filter :proxy_error
def proxy
method = request.method.downcase.to_sym
result = request_widget_backend(params[:path], method, permitted_params)
if method == :put
if result
head :no_content
else
head :bad_request
end
else
render json: result
end
end
def request_widget_backend(path, method = :get, parameters = {})
request_params = if method == :get
{
method: :get,
url: URI.join(config.url, path).to_s,
headers: { params: parameters }
}
else
{
method: method,
url: "#{URI.join(config.url, path)}?hccp_auth_token=#{params[:hccp_auth_token]}",
payload: parameters.to_json
}
end
RestClient::Request.execute(request_params)
end
def proxy_error
yield
rescue RestClient::Exception => e
render json: e.response, status: e.response.code
end
private
def permitted_params
params.symbolize_keys.except(*service_params)
end
def service_params
%i[controller action path format]
end
|
ВАЖНО: В случае ошибки выполнения запроса необходимо возвращать код ошибки, как это сделано в методе proxy_error
, чтобы в случае, если, например, истек срок действия токена, то виджет заново аутентифицировался.
Встраивание JS
После загрузки JS и CSS из HCCP выполняется инициализация виджета данными приложения и сущности, после чего вызывается функция render()
.
...
Имя | Значение (пример) | Обязательный |
---|---|---|
baseURL | URL по которому виджет ходить в APIвыполняет запросы, может быть как полным адресом В первом случае виджет будет выполнять запросы к Во втором случае – | Нет |
locale | Язык, с которым будет инициализирован виджет (' ru') | Нет |
customerId | id абонента, которые должен отображаться в виджете | Да |
containerId | id элемента, в котором отобразится виджет('customer-widget-id') | Да |
...
Code Block | ||||
---|---|---|---|---|
| ||||
!!! %html %head %script{type: "text/javascript", src: "http://localhost:3000/customerWidget.js"} %link{rel: 'stylesheet', type: "text/css", href: "http://localhost:3000/customerWidget.css"} %body %div %h1 Welcome %p #widget#customer-widget-id{style: 'width: 1000px; margin: 0 auto; font-size: 13px; border: 5px dashed lightgrey;'} :javascript document.addEventListener('DOMContentLoaded', () => { HCCPWidgetHCCPCustomerWidget.render({ baseURL: '/hccp/', locale: 'ru', customerId: '50162901', containerId: 'customer-widget-id', }); }); |