HashLoad / jhonson

Middleware for parse JSON in HORSE
MIT License
101 stars 26 forks source link

Internal Application Error #4

Closed giorgiobazzo closed 4 years ago

giorgiobazzo commented 4 years ago

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 linha

Res.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:

<html><body><h1>Internal Application Error</h1>
<p>Invalid pointer operation
<p><hr width="100%"><i>/ping</i></body></html>

Se eu deixar o body da requisição vazio, o erro não ocorre.

Em anexo o projeto que estou testando. HORSEAPI.zip

viniciussanchez commented 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.

giorgiobazzo commented 4 years ago

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?