Mostrando Acentuação numa API feita em REST | Ti Responde 0212

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:

 

  1. Se for tlppCore, você consegue definir o charset padrão direto no appServer.ini
  2. Você pode trabalhar com o UTF-8, mas ai no setResponse você tem que usar a função EncodeUTF8
  3. 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:

 

Bom pessoal, por hoje é só.

 

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação