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

Skip to content

Implementacoes para tratamento de QueryParams como List#391

Merged
viniciussanchez merged 5 commits into
HashLoad:masterfrom
fabiohmribeiro:master
Jul 30, 2024
Merged

Implementacoes para tratamento de QueryParams como List#391
viniciussanchez merged 5 commits into
HashLoad:masterfrom
fabiohmribeiro:master

Conversation

@fabiohmribeiro

@fabiohmribeiro fabiohmribeiro commented Jun 5, 2024

Copy link
Copy Markdown

Implementado o método AsList na classe THorseCoreParamField para converter automaticamente os valores separados por vírgula do parâmetro de consulta em uma lista do tipo especificado. Adicionei suporte para os tipos Integer, Int64, Double, String, Variant, DateTime, Date e Time. Utilizei TValue para conversão de tipo e tratamento de exceções para tipos não suportados.

Atualizado o método InitializeQuery na classe THorseRequest para incluir a condição que permite concatenar os valores separados por vírgula quando houver repetição de QueryParam.

Contexto:

Recentemente, enfrentei um desafios ao lidar com queryparams como arrays (por exemplo, test=1,2,3), exigindo uma abordagem manual. Para solucionar isso, implementei o método "AsList", que converte automaticamente os query parameters em um "TList".

Outro ponto de melhoria foi na montagem do "InitializeQuery". Originalmente construído com um dicionário, ele não conseguia lidar adequadamente com múltiplos QueryParams do mesmo nome (por exemplo, ?test=123,test=abc), resultando na captura apenas do último valor definido. Com a atualização da função, agora ele concatena os valores encontrados para o campo, separando-os por vírgula. Isso cria uma representação semelhante a um array (por exemplo, teste=123,abc), permitindo que o método "AsList" também processe e transforme esse caso em um "TList".

Exemplo simples de uso

THorse.Get('/list',
procedure (Req: THorseRequest; Res: THorseResponse)
begin
   var teste  := Req.Query.Field('test').AsList<string>;
   var  response := String.Join(', ', teste.ToArray);
   teste.Free;

   Res.Send(response).Status(200);
end);

…onverter automaticamente os valores separados por vírgula do parâmetro de consulta em uma lista do tipo especificado. Adicionei suporte para os tipos Integer, Int64, Double, String, Variant, DateTime, Date e Time. Utilizei TValue para conversão de tipo e tratamento de exceções para tipos não suportados.

Atualizado o método InitializeQuery na classe THorseRequest para incluir a condição que permite concatenar os valores separados por vírgula quando houver repetição de QueryParam.
@viniciussanchez

Copy link
Copy Markdown
Member

Obrigado pela contribuição...
Chegou a testar no Lazarus?
Outro detalhe, na montagem da lista, não deveria diferenciar Integer de Int64?

@fabiohmribeiro

Copy link
Copy Markdown
Author

Obrigado pela contribuição... Chegou a testar no Lazarus? Outro detalhe, na montagem da lista, não deveria diferenciar Integer de Int64?

Verdade não tinha me atentado, mas já efetuei a correção.

Quanto ao Lazarus, não realizei o teste pois não possuo ele aqui, caso alguém consiga de forma mais rápida, do contrário, consigo fazer mais para o final da semana.

…azarus.

A função AsList<T> foi ajustada para lidar com as diferenças de suporte a tipos genéricos entre o Delphi e o Lazarus. No Lazarus, devido à ausência de suporte direto para tipos genéricos como no Delphi, foi necessário adotar uma abordagem alternativa usando diretivas de compilação.

No Delphi, a função permite a utilização de tipos genéricos diretamente:
Exemplo: Req.Query.Field('test').AsList<integer>;

No Lazarus, o retorno da função é sempre um TList de strings devido às limitações no suporte a tipos genéricos:
Exemplo: Req.Query.Field('test').AsList;

Essas alterações garantem que a função AsList<T> funcione corretamente em ambos os ambientes de desenvolvimento, mantendo a compatibilidade e a funcionalidade esperada.
@fabiohmribeiro

fabiohmribeiro commented Jun 13, 2024

Copy link
Copy Markdown
Author

@viniciussanchez fiz uma abordagem diferente tratando os dois casos. Segue:

No Delphi, a função permite a utilização ou não de tipos genéricos diretamente. Sem generics o retorno assumirá TList de strings.

Exemplo

Req.Query.Field('test').AsList;
Req.Query.Field('test').AsList<integer>;

No Lazarus, o retorno da função é sempre um TList de strings devido às limitações no suporte a tipos genéricos Nao aceita a abordagem .AsList<T>: TList<T>

Exemplo

Req.Query.Field('test').AsList;

Teste em Delphi: OK

image

Teste no Lazarus: OK

image

@viniciussanchez viniciussanchez merged commit 468b5f1 into HashLoad:master Jul 30, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants