discovery-tecnologia/dsc-mercado-livre

$offset > 52, devolve erro : 'Array to string conversion'

Closed this issue · 22 comments

$service = new OrderService($meli);

        $limit = 50;
        $offset = 53;
        $sort = 'date_desc';

        $orders = $service->findOrdersBySeller(256626064,$limit,$offset,$sort);

Devolve o seguinte erro:

vendor/jms/serializer/src/JMS/Serializer/GenericDeserializationVisitor.php:61
'Array to string conversion'

se coloco o $offset = 52 ;
dai funciona normal,
são 350 vendas que gostaria de consular, então preciso que o offset possa ser maior que isso, já que o $limit máximo é 50...

poderia me direcionar para que eu consiga consultar todos as vendas ??
(estou usando o Laravel como framework)

Ola @timoteo7
Estranho... vc tem um total de 350 registros eh isso? e quando coloca 52 funciona???
Esse eh um recurso de paginacao similar ao banco de dados...

Entao no seu cenario o correto seria...
offset = 0, limit = 50 (50 registros)
offset = 1, limit = 50 (+50 registros)
offset = 2, limit = 50 (+50 registros)
offset = 3, limit = 50 (+50 registros)
offset = 4, limit = 50 (+50 registros)
offset = 5, limit = 50 (+50 registros)
finalizou...
total: 350 registros

O Mercado Livre sempre retorna um JSON de Pagging na consulta. EX

"paging": {
    "total": 1,
    "offset": 0,
    "limit": 50
  },

https://developers.mercadolivre.com.br/en_us/order-management#close

ok, obrigado, como o offset=52 havia funcionado pensei que seria o numero de registros a pular não o de paginação, desculpe pelo engano..

Show @timoteo7
Que bom que funcionou!

Na verdade testei o que disse que cada offset seria +50 registros (com o limit como 50),
mas não está sendo, está sendo por registro mesmo,
tenho que colocar offset=50 para conseguir ver os próximos 50 registros,
mas como teve mais venda agora (Total 361) o erro só repete quando o offset > 63

@dilowagner

se coloco
$sort = 'date_asc';
mesmo com o offset = 0;
também já devolve o mesmo erro

Opa @timoteo7
Tenho que ver se mudou algo na API então...

@timoteo7 com relacao ao offset, deixo ver se entendi entao...
No seu caso sao 361 registros correto?

Entao no seu cenario o correto nao seria isso?
$offset = 0, $limit = 50 (50 registros)
$offset = 50, $limit = 50 (+50 registros)
$offset = 100, $limit = 50 (+50 registros)
$offset = 150, $limit = 50 (+50 registros)
$offset = 200, $limit = 50 (+50 registros)
$offset = 250, $limit = 50 (+50 registros)
$offset = 300, $limit = 50 (+50 registros)
$offset = 350, $limit = 50 (+11 registros)
finalizou...
total: 361 registros

E uma abordagem diferente... (nem sabia disso...haha)
https://developers.mercadolivre.com.br/pt_br/resultados-de-paginacao

Sobre a ordenacao, infelizmente so podemos utilizar o que eh disponivel na API
Consultando aqui, percebi que o available_sorts e so pelo date_desc:

"available_sorts": [
    {
      "id": "date_desc",
      "name": "Date descending"
    }
  ],

https://developers.mercadolivre.com.br/pt_br/items-e-buscas

não consigo colocar $offset =100 ou $offset = 150 como no teu exemplo,
mas o numero do $offset que dá erro vai mudando de acordo com a quantidade de vendas,
agora tem 377 vendas e o erro ocorre quando o $offset=80,

350 erro com 53
361 erro com 64
377 erro com 80

(na proporção parece que com 257 vendas no total daria erro mesmo com $offset = 0 )

@timoteo7
Você consegue debugar e colar aqui (oculta os dados sensíveis) o retorno do JSON antes dele fazer o parser?

vendor/jms/serializer/src/JMS/Serializer/GenericDeserializationVisitor.php:61
'Array to string conversion'

Quero entender o que ele está retornando, ou se tem alguma mensagem de erro

Eu não tenho dados na minha conta, não consigo simular o seu cenário...

$meli = new Meli(************, ***********************);
$service = new AuthorizationService($meli);
$token = $service->getAccessToken();

pode utilizar estes dados mesmo, depois eu edito,
o erro é o mesmo de quando tentei colocar ordenação acendente (que não existe)
talvez esteja retornando só um '[ ]' vazio ,
talvez só colocar para verificar se não é um array,
antes de onde está dando erro (parser):

vendor/jms/serializer/src/JMS/Serializer/GenericDeserializationVisitor.php:61
'Array to string conversion'

Opa, @timoteo7
Obrigado por enviar os dados...

Cara, fiz os testes com os seus dados aqui e nao tive problemas...
Segue como testei...

// imports aqui...

// COLOCA OS DADOS AQUI...
$clientId = null;
$clientSecret = null;
$sellerId = null;

$meli = new Meli($clientId, $clientSecret);
$service = new AuthorizationService($meli);
$service->getAccessToken();

$service = new OrderService($meli);

$registros = 381; // eu ja sabia o total coloquei aqui so pra teste
$it = round($registros/50); // vou trazer a cada 50 (offset)
//print "ITE: ".($it);
$o    = 0;
$soma = 0;
for($i = 0; $i < $it; $i++) {
    
    $offset = $o;
    $limit  = 50;
    $sort   = 'date_desc';

    print "DADOS DA CONSULTA\n";
    print "OFFSET: $offset\n";
    print "LIMIT:  $limit\n";
    print "SORT:   $sort\n\n";

    $orders = $service->findOrdersBySeller($sellerId,$limit,$offset,$sort);

    $paging = $orders->getPaging();
    $total  = $paging->getTotal();
    $offset = $paging->getOffset();
    $limit  = $paging->getLimit();

    $count = $orders->getResults()->count();

    print "RESULTADOS DA CONSULTA\n";
    print "TOTAL:  $total\n";
    print "OFFSET: $offset\n";
    print "LIMIT:  $limit\n";

    print "TOTAL REGISTROS RETORNADOS NA CONSULTA: $count\n\n";
    $soma += $count;
    $o += 50; // a cada 50 de offset...
    print "#################################################################\n\n";
    sleep(1);
}
print "TOTAL REGISTROS DE VENDAS: $soma\n\n";

Fui incrementando o offset conforme te falei anteriormente (a cada 50), 0, 50, 100, 150, etc...

DADOS DA CONSULTA
OFFSET: 0
LIMIT:  50
SORT:   date_desc

RESULTADOS DA CONSULTA
TOTAL:  381
OFFSET: 0
LIMIT:  50
TOTAL REGISTROS RETORNADOS NA CONSULTA: 50

#################################################################

DADOS DA CONSULTA
OFFSET: 50
LIMIT:  50
SORT:   date_desc

RESULTADOS DA CONSULTA
TOTAL:  381
OFFSET: 50
LIMIT:  50
TOTAL REGISTROS RETORNADOS NA CONSULTA: 50

#################################################################

DADOS DA CONSULTA
OFFSET: 100
LIMIT:  50
SORT:   date_desc

RESULTADOS DA CONSULTA
TOTAL:  381
OFFSET: 100
LIMIT:  50
TOTAL REGISTROS RETORNADOS NA CONSULTA: 50

#################################################################

DADOS DA CONSULTA
OFFSET: 150
LIMIT:  50
SORT:   date_desc

RESULTADOS DA CONSULTA
TOTAL:  381
OFFSET: 150
LIMIT:  50
TOTAL REGISTROS RETORNADOS NA CONSULTA: 50

#################################################################

DADOS DA CONSULTA
OFFSET: 200
LIMIT:  50
SORT:   date_desc

RESULTADOS DA CONSULTA
TOTAL:  381
OFFSET: 200
LIMIT:  50
TOTAL REGISTROS RETORNADOS NA CONSULTA: 50

#################################################################

DADOS DA CONSULTA
OFFSET: 250
LIMIT:  50
SORT:   date_desc

RESULTADOS DA CONSULTA
TOTAL:  381
OFFSET: 250
LIMIT:  50
TOTAL REGISTROS RETORNADOS NA CONSULTA: 50

#################################################################

DADOS DA CONSULTA
OFFSET: 300
LIMIT:  50
SORT:   date_desc

RESULTADOS DA CONSULTA
TOTAL:  381
OFFSET: 300
LIMIT:  50
TOTAL REGISTROS RETORNADOS NA CONSULTA: 50

#################################################################

DADOS DA CONSULTA
OFFSET: 350
LIMIT:  50
SORT:   date_desc

RESULTADOS DA CONSULTA
TOTAL:  381
OFFSET: 350
LIMIT:  50
TOTAL REGISTROS RETORNADOS NA CONSULTA: 31

#################################################################

TOTAL REGISTROS DE VENDAS: 381

Mesmo testando com um offset "quebrado" $offset = 80 ele retorna corretamente...

Uma coisa que esqueci de te perguntar eh... qual versao do PHP voce esta usando???

usou a mesma maneira que eu:
$orders = $service->findOrdersBySeller(256626064,$limit,$offset,$sort); ??

Minha versão é:

PHP 7.3.9-1+ubuntu18.04.1+deb.sury.org+1

que estranho, então realmente não deve ser um bug do repositório mesmo, vai que é minha versão...

Sim, usei o mesmo metodo...

Pode ser a versao do PHP, nao cheguei a testar com a versao 7.3...
Vou tentar testar aqui pra ver...

@timoteo7

Realizei o teste com o PHP7.3 e funcionou sem problemas :( tive o mesmo resultado anterior...

PHP 7.3.10 (cli) (built: Oct 17 2019 15:09:28) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.10, Copyright (c) 1998-2018 Zend Technologies

Na sua aplicacao vc tambem usa o JMS Serialize pra alguma coisa? Qual versao do Laravel esta usando?

Pode ser algo do Laravel então,
eu fiz o teste com o Laravel 5.8 e o 6.0 e para mim o erro se repete,
(eu não estou usando o JMS Serialize)

mas como para você o erro não aparece não tem como visualizar o que acontece...
conseguiria fazer este mesmo teste que fiz em um Controller do Laravel ?

use Dsc\MercadoLivre\Meli;
use Dsc\MercadoLivre\Resources\Authorization\AuthorizationService;
use Dsc\MercadoLivre\Resources\Order\OrderService;
$meli = new Meli(env('ML_APP_ID'), env('ML_APP_SECRET'));
$service = new AuthorizationService($meli);
$token = $service->getAccessToken();

   $service = new OrderService($meli);

        $array=[];
        for($x = 0; $x <= 2; $x++){
            $orders = $service->findOrdersBySeller( 256626064, '50', $x*50 , 'date_desc');
            $response=$orders->getResults()->toArray();
            $array=array_merge($array,$response);
        }
        dd($array);

Poise, acho bem estranho...
Vou tentar fazer um teste com Laravel, esta semana devo iniciar um projeto com ele...
Cara, nao deve ser isso... mas vc tentou passar o $limit como Integer ao inves de String?

Já tentei isso sim, passei tudo como string ou tudo como intenger, não fez diferença...

350 erro com 53
361 erro com 64
377 erro com 80

agora com 406 vendas da erro com o $offset = 5

@timoteo7
Criei o projeto com o Laravel e encontrei o problema...hahaha

Tinha um mapeamento errado no retorno do objeto de Feedback... estava retornando o Sale e Purchase como string...
Gerei uma nova versao: 1.7.4

O problema acontecia internamente quando o JMSSerialize fazia o parse

$data = (string) $data;

So que sinceramente nao entendi porque so acontece o erro no Laravel... hahaha enfim.. :(

muito obrigado por resolver isso com o Laravel, já testei e deu tudo certo...

Show de bola @timoteo7
Vou fechar essa issue, qualquer coisa reabrimos outra...

Valeu...