Fala zumbizada esperta! Que título monstruoso, não?
Hoje estou passando aqui pra deixar uma técnica relacionada a WDA que eu “recolhi” de alguns sites e que se mostrou bem útil.
Quando você está trabalhando com conteúdo MIME dinâmico (i.e. arquivos de qualquer espécie), não dá pra usar o repositório do seu componente, porque obviamente você não tem o conteúdo nem o tipo dele em tempo de desenvolvimento (pense num job ou uma função que gera um binário de um PDF ou de uma imagem JPG de algum repositório).
Solução? Fazer o upload no cache do servidor onde está rodando a sua aplicação, e depois chamar a URL gerada para mostrar o conteúdo. Simples e tranquilo.
A única pegadinha é que não dá pra consultar diretamente a tabela do cache pra saber se o seu conteúdo ainda está válido ali, mas dá pra resolver isso usando o tempo de expiração do objeto. Vamos ao código:
DATA: lv_hora_expiracao TYPE timestamp,
lv_comp TYPE i,
lv_timestamp TYPE timestamp,
lv_tp_conteudo TYPE string,
lv_content_type TYPE string,
lo_cached_response TYPE REF TO if_http_response,
lv_conteudo TYPE xstring,
lv_url TYPE string,
lv_nome_arquivo TYPE string,
lv_expires_abs_date TYPE d,
lv_expires_abs_time TYPE t,
lv_guid TYPE guid_32.
* Antes de começar o processo, verificamos se o conteúdo que já foi
* colocado anteriormente no cache ainda está válido. Se ainda estiver
* válido, não é preciso fazer um novo upload.
IF NOT lv_hora_expiracao IS INITIAL.
GET TIME STAMP FIELD lv_timestamp.
lv_comp = cl_abap_tstmp=>compare(
tstmp1 = lv_timestamp
tstmp2 = lv_hora_expiracao
).
ENDIF.
IF lv_comp <> -1.
* Neste caso, o timestamp atual é igual ou superior ao timestamp de
* expiração, portanto temos que subir o conteúdo novamente para o
* cache.
**********************************************************************
* 1. Determinação do conteúdo
**********************************************************************
* Criamos primeiro o objeto do cache:
CREATE OBJECT lo_cached_response
TYPE cl_http_response
EXPORTING
add_c_msg = 1.
* O conteúdo aqui vem de alguma fonte dinâmica (upload, módulo de
* função, gravado em alguma tabela, etc.) em formato XSTRING:
lo_cached_response->set_data( lv_conteudo ).
* Determinamos o MIME type do conteúdo que vai ser gravado. Abaixo
* estão 2 tipos mais comuns, adapte conforme a sua necessidade:
CASE lv_tp_conteudo.
WHEN 'JPG'.
lv_content_type = 'image/jpeg'.
WHEN 'PDF'.
lv_content_type = 'application/pdf'.
WHEN OTHERS.
* ...
ENDCASE.
lo_cached_response->set_header_field(
name = if_http_header_fields=>content_type
value = lv_content_type
).
* Determinando o status do pacote (sempre OK):
lo_cached_response->set_status(
code = 200
reason = 'OK'
).
**********************************************************************
* 2. Determinando a URL
**********************************************************************
* Normalmente é possível usar a própria URL da sua aplicação, que pode
* ser obtida com a classe CL_WD_UTILITIES. Caso isso não seja possível,
* verifique com o Basis um caminho.
cl_wd_utilities=>construct_wd_url(
EXPORTING
application_name = wd_this->wd_get_api( )->get_application( )->get_application_info( )->get_name( )
IMPORTING
out_local_url = lv_url
).
* Se você tiver o nome do arquivo, use o prório junto com a URL.
lv_url = lv_url && '/' && lv_nome_arquivo.
* Caso você não tenha ou o conteúdo seja dinâmico, crie um caminho
* usando a função GUID_CREATE:
CALL FUNCTION 'GUID_CREATE'
IMPORTING
ev_guid_32 = lv_guid.
lv_url = lv_url && '/' && lv_guid. "não precisa de extensão
**********************************************************************
* 3. Definindo a validade do conteúdo
**********************************************************************
* Essa validade tem que ser gravada no contexto junto da URL, para que
* possamos testar depois
GET TIME STAMP FIELD lv_hora_expiracao.
* Qualquer valor entre 1 e 3min é razoável, porém ajuste conforme o
* seu ambiente
lv_hora_expiracao = cl_abap_tstmp=>add(
tstmp = lv_hora_expiracao
secs = 180
).
CONVERT TIME STAMP lv_hora_expiracao
TIME ZONE 'BRAZIL'
INTO DATE lv_expires_abs_date
TIME lv_expires_abs_time.
lo_cached_response->server_cache_expire_abs(
EXPORTING
expires_abs_date = lv_expires_abs_date
expires_abs_time = lv_expires_abs_time
).
**********************************************************************
* 4. Upload do conteúdo
**********************************************************************
cl_http_server=>server_cache_upload(
url = lv_url
response = lo_cached_response
).
ENDIF.
Se você tiver aquele aceso IXXXPERTO você pode conferir o cache na transação SMICM indo em Goto > HTTP Plug-In > Server Cache > Display.
Por enquanto é isso, espero que seja útil para vocês. E eu juro que vou terminar a série de segurança (só que esse ano não dá mais né?)
esse ano a gente não tem mais segurança no sap=(
Muito útil seu post, vlw. Para não limitar a extensão dos arquivos no código, você pode utilizar a função SDOK_MIMETYPE_GET para pegar o mime type.
Ótima dica, valeu!