Closed giorgiobazzo closed 4 years ago
Olá @giorgiobazzo , O erro que está ocorrendo é um Access Violation, Isso ocorre neste exemplo porque ao utilizar o middleware do jhonson, ao receber uma requisição, ele vai fazer o parse do body que até então é string, para um TJSONValue. No exemplo, essa mesma instância é passada para o Response. Ou seja, tanto o Request quanto o Response, estão olhando para a mesma instância. Ao encerrar a requisição, vai ser destruído as instâncias, entao ele destrói a instância de Request e depois a instância do Response, ao destruir a instância do response, ele tenta também destruir a instância do JSON que já foi destruído na instância da Request.
Olá @viniciussanchez A pouco já tinha percebido isso então mudei o código do exemplo para:
...
App.Post('/ping',
procedure(Req: THorseRequest; Res: THorseResponse; Next: TProc)
var
LBody: TJSONObject;
begin
LBody := TJSONObject.ParseJSONValue(Req.Body) as TJSONObject;
Res.Send<TJSONObject>(LBody);
end);
....
Agora está funcionado. Mas em um vídeo no canal da HashLoad (https://www.youtube.com/watch?v=6maEZcbVEEg&t=2078s) vi que o Matheus fez como esta no exemplo, mas usando o Delphi 10.3, e funcionou. Será que no caso dele funcionou por alguma implementação nova da versão do Delphi?
Estou tentando rodar o exemplo do ping exatamente como esta aqui no repositório. Estou usando o Delphi Tokyo 10.2 Version 25.0.29899.2631, e para testar a Url os clients RestDebugger e o Insomnia. No client estou setando o método como POST, a URL: http://localhost:9000/ping, o content-type: application/json e o body da requisição com o json:
{"test":"test"}
Ao debugar parece que tudo esta executando corretamente, não consegui pegar nenhuma exceção. Aparentemente a linhaRes.Send<TJSONObject>(LBody);
executa sem problemas, mas tando no Insomnia quanto no RestDebugger estou recebendo um HTTP/1.1 500 Internal Server Error com o seguinte conteúdo:
Se eu deixar o body da requisição vazio, o erro não ocorre.
Em anexo o projeto que estou testando. HORSEAPI.zip