No vídeo de hoje, vamos demonstrar em como exibir acentuação normalmente nas requisições das APIs em REST.
A dúvida de hoje, nos perguntaram, o motivo de alguns caracteres virem embaralhados ou com uma interrogação ao consumir uma API feita em REST.
Pensando nisso, montamos um exemplo, onde vamos mostrar que o causador desse cenário é a diferença entre o charset do texto com o da requisição. Quando fazemos uma requisição, por padrão, ela trabalha com UTF-8 mas os textos no Protheus trabalham com CP1252 (ou Windows 1252). Então para sanar esse cenário, tem 3 possibilidades:
- Se for tlppCore, você consegue definir o charset padrão direto no appServer.ini
- Você pode trabalhar com o UTF-8, mas ai no setResponse você tem que usar a função EncodeUTF8
- Ou você pode trabalhar com CP1252 (ai precisa ver se o sistema que vai consumir essa API tem suporte a CP1252, senão já parte para a alternativa b), e no SetContentType, você manda o charset como cp1252
Segue abaixo o vídeo exemplificando:
E abaixo o código fonte desenvolvido:
//Bibliotecas
#Include "Totvs.ch"
#Include "RESTFul.ch"
/*/{Protheus.doc} WSRESTFUL zWsTest
Teste Acentuação
@author Atilio
@since 14/09/2024
@version 1.0
@type wsrestful
/*/
WSRESTFUL zWsTest DESCRIPTION 'Teste Acentuação'
//Métodos
WSMETHOD GET TST1 DESCRIPTION 'Retorna mensagem de teste (com problemas)' WSSYNTAX '/zWsTest/get_tst1' PATH 'get_tst1' PRODUCES APPLICATION_JSON
WSMETHOD GET TST2 DESCRIPTION 'Retorna mensagem de teste (com acentuação)' WSSYNTAX '/zWsTest/get_tst2' PATH 'get_tst2' PRODUCES APPLICATION_JSON
WSMETHOD GET TST3 DESCRIPTION 'Retorna mensagem de teste (cp1252)' WSSYNTAX '/zWsTest/get_tst3' PATH 'get_tst3' PRODUCES APPLICATION_JSON
END WSRESTFUL
/*/{Protheus.doc} WSMETHOD GET TST1
Mensagem de teste (que terá problemas)
@author Atilio
@since 14/09/2024
@version 1.0
@type method
/*/
WSMETHOD GET TST1 WSSERVICE zWsTest
Local lRet := .T.
Local jResponse := JsonObject():New()
//Monta uma mensagem que tenha descrição
jResponse['id'] := 1
jResponse['obs'] := "Mensagem em CP1252 enviando no padrao UTF-8"
jResponse['msg'] := "O sabiá não sabia que o sábio sabia que o sabiá não sabia assobiar."
Self:SetContentType('application/json')
Self:SetResponse(jResponse:toJSON())
Return lRet
/*/{Protheus.doc} WSMETHOD GET TST2
Mensagem de teste (com acentuação)
@author Atilio
@since 14/09/2024
@version 1.0
@type method
/*/
WSMETHOD GET TST2 WSSERVICE zWsTest
Local lRet := .T.
Local jResponse := JsonObject():New()
//Define o retorno
jResponse['id'] := 2
jResponse['obs'] := "Enviando no padrão UTF-8 convertendo a string de CP1252 com EncondeUTF8"
jResponse['msg'] := "O sabiá não sabia que o sábio sabia que o sabiá não sabia assobiar."
Self:SetContentType('application/json') //Quando não manda nada, o charset fica como utf-8
Self:SetResponse(EncodeUTF8(jResponse:toJSON()))
Return lRet
/*/{Protheus.doc} WSMETHOD GET TST3
Mensagem de teste (com acentuação, usando cp1252)
@author Atilio
@since 14/09/2024
@version 1.0
@type method
/*/
WSMETHOD GET TST3 WSSERVICE zWsTest
Local lRet := .T.
Local jResponse := JsonObject():New()
//Monta uma mensagem que tenha descrição
jResponse['id'] := 3
jResponse['obs'] := "String em CP1252 e modificando o charset direto no content-type"
jResponse['msg'] := "O sabiá não sabia que o sábio sabia que o sabiá não sabia assobiar."
Self:SetContentType('application/json; charset=cp1252;')
Self:SetResponse(jResponse:toJSON())
Return lRet
Links de Apoio:
- TDN – Métodos da classe REST: https://tdn.totvs.com/pages/releaseview.action?pageId=555270134
- TDN – Charset (tlppCore): https://tdn.totvs.com/display/tec/Charset
Bom pessoal, por hoje é só.
Abraços e até a próxima.