Por que o Datasnap REST retorna um JSON “sujo”?

Eu sabia que tinha um motivo, mas já tinha me esquecido! E esses dias lendo a documentação mais uma vez, “lembrei” do porque que o resultado do Datasnap é sempre um array:

{result:[<seu retorno>]}

É feito assim pois “<seu retorno>” pode não ser um valor único, visto que em Delphi podemos ter parâmetros out e var, lembra?!

Desta forma, o Datasnap está sempre pronto para pegar todos os parâmetros out e var e colocar nesse array, sendo exatamente esta a ordem: outs, vars e result. Ou seja, essa “sujeira” é pra nos ajudar a ser mais produtivos. É por conta disso que conseguimos gerar as classes proxies e construir a aplicação cliente com tanta facilidade! 😉

Poxa, mas não tinha um jeito melhor de fazer, não?! Bem, como diria o sábio Chicó:

“Não sei, só sei que foi assim…”

Para contornar isso, basta usar apenas métodos que só retornem dados pelo result (sem parâmetros var e out), assim seu array terá sempre somente uma posição. Aí você implementa o evento onFormatResult do seu componente Dispatcher…

procedure TWebModule1.DSHTTPWebDispatcher1FormatResult(Sender: TObject;
  var ResultVal: TJSONValue; const Command: TDBXCommand; var Handled: Boolean);
var
  Aux: TJSONValue;
begin
  Aux := ResultVal;
  ResultVal := TJSONArray(Aux).Items[0];
  TJSONArray(Aux).Remove(0);
  Aux.Free;
end;

…e pronto! Somiu com o Array do result! 🙂

Ah, caso não queira que a palavra “result” seja enviada também, é só acrescentar “Handled := true;” na última linha do evento onFormatResult, ficando assim:

procedure TWebModule1.DSHTTPWebDispatcher1FormatResult(Sender: TObject;
  var ResultVal: TJSONValue; const Command: TDBXCommand; var Handled: Boolean);
var
  Aux: TJSONValue;
begin
  Aux := ResultVal;
  ResultVal := TJSONArray(Aux).Items[0];
  TJSONArray(Aux).Remove(0);
  Aux.Free;
  Handled := True;
end;

Agora, se você acredita que este overhead de processamento pode prejudicar seu projeto (o que é pouco provável na maioria dos casos), considere usar o RAD Server. Mas isto é assunto para outro post 😉

Um forte abraço,
KM

Deixe sua opinião

%d blogueiros gostam disto: