Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Na versão Seattle o Body do Request não esta reconhecendo caracteres especiais#364

Merged
viniciussanchez merged 3 commits into
HashLoad:masterfrom
ds-sampaio:master
Jul 30, 2024
Merged

Na versão Seattle o Body do Request não esta reconhecendo caracteres especiais#364
viniciussanchez merged 3 commits into
HashLoad:masterfrom
ds-sampaio:master

Conversation

@ds-sampaio

Copy link
Copy Markdown
Contributor

Utilizando o windows, postman e Delphi Seattle.
Conteúdo do Body:
{ "nome": "TIPOSEPARACAO", "descricao": "Tipo de separação" }

Na api, na chegada do Request.Body:
{ "nome": "TIPOSEPARACAO",'#$D#$A' "descricao": "Tipo de separação"'}

Sugestão de correção no metodo Body do Horse.Request
function THorseRequest.Body: string; begin {$IF CompilerVersion <= 31.0} Result := TEncoding.UTF8.GetString(BytesOf(FWebRequest.RawContent)); {$ELSE} Result := FWebRequest.Content; {$ENDIF} end;

@viniciussanchez viniciussanchez added the bug Something isn't working label Nov 17, 2023
@viniciussanchez

Copy link
Copy Markdown
Member

@ds-sampaio chegou a testar esse código no Lazarus?

@ds-sampaio

Copy link
Copy Markdown
Contributor Author

@viniciussanchez No lazarus não cheguei a testar

@antoniojmsjr

Copy link
Copy Markdown
Contributor

Eu acho que essa alteração não é tão simples assim, desta forma está limitando a codificação em UTF-8, e por algum motivo pode estar sendo enviado no body um text com encoding ASCII que pode gera erro de codificação.

O problema não está no Horse, é sim na unit Web.HTTPApp.pas que faz o parse do body, verifica como está na tua versão do Delphi, estou usando o Delphi RIO 10.3.3.

image

@viniciussanchez

Copy link
Copy Markdown
Member

Sim... eu vejo alguns reclamando de problemas de encode mas realmente usamos aqui e até hoje sem problemas com acentuação. Pode realmente ser algum problema na versão do Delphi mesmo.

@antoniojmsjr

Copy link
Copy Markdown
Contributor

Sim... eu vejo alguns reclamando de problemas de encode mas realmente usamos aqui e até hoje sem problemas com acentuação. Pode realmente ser algum problema na versão do Delphi mesmo.

Uma alternativa é criar um overload da função Body passando um TEncoding, assim não fica engessado a codificação, por exemplo:

function Body(const Encoding: TEncoding): string; overload; virtual;

function THorseRequest.Body(const Encoding: TEncoding): string;
begin
  {$IF DEFINED(FPC)}
  Result := Body; // Tem que ver no Lazarus qual a classe de Encoding disponível, como default está retornando o Body
  {$ELSE}
  {$IF CompilerVersion <= 31.0}
  Result := Encoding.GetString(BytesOf(FWebRequest.RawContent));
  {$ELSE}
  Result := Encoding.GetString(FWebRequest.RawContent);
  {$ENDIF}
  {$ENDIF}
end;

@ds-sampaio

Copy link
Copy Markdown
Contributor Author

Então na minha versão do delphi que é o Seatlle ta diferente do teu Delphi Rio.
Veja:
image

@ds-sampaio ds-sampaio closed this Jan 16, 2024
@ds-sampaio ds-sampaio reopened this Jan 16, 2024
@ds-sampaio

ds-sampaio commented Jan 16, 2024

Copy link
Copy Markdown
Contributor Author

antoniojmsjr Essa solução de criar um overload function Body(const Encoding: TEncoding): string; overload; virtual;
atende ao que preciso, posso realizar a alteração e enviar o PR?

@antoniojmsjr

Copy link
Copy Markdown
Contributor

antoniojmsjr Essa solução de criar um overload function Body(const Encoding: TEncoding): string; overload; virtual; atende ao que preciso, posso realizar a alteração e enviar o PR?

O bom seria a gente identificar a classe de Encoding que tem disponível no Lazarus para implementar essa alteração também, no momento estou de férias e não vou consegui te ajudar agora, só na volta.

@antoniojmsjr

Copy link
Copy Markdown
Contributor

antoniojmsjr Essa solução de criar um overload function Body(const Encoding: TEncoding): string; overload; virtual; atende ao que preciso, posso realizar a alteração e enviar o PR?

Fiz um teste aqui no Lazarus e achei uma maneira de fazer o enconding:

function THorseRequest.Body(const Encoding: TEncoding): string;
{$IF DEFINED(FPC)}
var
  lContent: TStringStream;
{$ENDIF}
begin
  {$IF DEFINED(FPC)}
  try
    lContent := TStringStream.Create(FWebRequest.Content, Encoding);
    Result := lContent.DataString;
  finally
    lContent.Free;
  end;
  {$ELSE}
  {$IF CompilerVersion <= 31.0}
  Result := Encoding.GetString(BytesOf(FWebRequest.RawContent));
  {$ELSE}
  Result := Encoding.GetString(FWebRequest.RawContent);
  {$ENDIF}
  {$ENDIF}
end;

Compilado com sucesso Lazarus: ✅
Compilado com sucesso Delphi Rio: ✅
Compilado com sucesso Delphi Seatlle: ⁉️ - Consegue testar @ds-sampaio?

@ds-sampaio

Copy link
Copy Markdown
Contributor Author

@antoniojmsjr Realizei o teste e funcionou perfeitamente no Delphi Seatlle

@antoniojmsjr

Copy link
Copy Markdown
Contributor

@antoniojmsjr Realizei o teste e funcionou perfeitamente no Delphi Seatlle

Blz, altera os fontes e faz o commit.

@ds-sampaio

Copy link
Copy Markdown
Contributor Author

@antoniojmsjr Acabei de realizar o commit
@viniciussanchez

@viniciussanchez viniciussanchez merged commit 48966d5 into HashLoad:master Jul 30, 2024
viniciussanchez added a commit that referenced this pull request Sep 17, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants