6
respostas

Problema ao usar as requisições. Gson não converte a resposta.

Estou testando o projeto Android de persistência web com uma outra API e tem algum problema que impede a conversão do retorno da requisição do link da API usando o GSON. O erro que eu recebo é sempre este:

java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$4.done(AsyncTask.java:399)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
        at java.util.concurrent.FutureTask.run(FutureTask.java:271)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)

   Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 2 path $
        at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:350)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:80)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:40)
        at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27)

A única coisa que muda é que ao invés da classe modelo Produto ter como propriedades id, nome, preco e quantidade, ela tem:

 private final long idProduto; 

 private final String dscProduto; 

 private final Double vlrUnitario; 

E também ao invés de utilizar o endereço IP do meu computador, a classe EstoqueRetrofit usa:

private static final String URL_BASE = "https://wfrsistemas.net.br/sites/testemobileapi/";

O end-point é o mesmo("produto").Aqui tá a interface ProdutoService, a única coisa que alterei na interface em relação ao projeto original foi o id, que agora é idProduto:

''' public interface ProdutoService {

    @GET("produto")
    Call<List<Produto>> buscaTodos();

    @POST("produto")
    Call<Produto> salva(@Body Produto produto);

    @PUT("produto/{idProduto}")
    Call<Produto> edita(@Path("idProduto") long idProduto,
                    @Body Produto produto);

    @DELETE("produto/{idProduto}")
    Call<Void> remove(@Path("idProduto") long idProduto);

} '''

O retorno inclusive usando o Postman é este aqui, com status 200:

"[{"idProduto":1,"dscProduto":"Produto 1","vlrUnitario":5},{"idProduto":2,"dscProduto":"Produto 2","vlrUnitario":10}, {"idProduto":3,"dscProduto":"Produto 3","vlrUnitario":15},{"idProduto":4,"dscProduto":"Produto 4","vlrUnitario":20}]"

6 respostas

Antonio, tudo bem ?

Cara acessei sua base e olha a resposta:

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">[{"idProduto":1,"dscProduto":"Produto 1","vlrUnitario":5},{"idProduto":2,"dscProduto":"Produto 2","vlrUnitario":10},{"idProduto":3,"dscProduto":"Produto 3","vlrUnitario":15},{"idProduto":4,"dscProduto":"Produto 4","vlrUnitario":20}]</string>

Tenta fazer isso:

@Headers("Accept: application/json")
 @GET("produto")
    Call<List<Produto>> buscaTodos();

Coloquei o @Headers("Accept: application/json") e o problema continua o mesmo. Já tentei de tudo e não consigo resolver. O LoggingInterceptor mostra que o Get é feito e depois da uma falha de Http do tipo: java.net.SocketTimeoutException: timeout.Ou as vezes o erro 503 indicando que o servidor esta temporariamente impossibilitado de responder as solicitações.

O mais estranho é que o código de status no Postman é o status 200, e o retorno que chega é este:

"[{"idProduto":1,"dscProduto":"Produto 1","vlrUnitario":5},{"idProduto":2,"dscProduto":"Produto 2","vlrUnitario":10}, {"idProduto":3, "dscProduto":"Produto 3","vlrUnitario":15},{"idProduto":4,"dscProduto":"Produto 4","vlrUnitario":20}]" , sem esta tag <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/"> que é exibida na frente do conteúdo quando acessamos pelo navegador web.

Eu só preciso saber como eu vou converter com Gson e exibir a resposta na minha aplicação utilizando por exemplo, uma API dessas ou outras espalhadas por aí. Em tese era pro Gson funcionar, o erro que sempre aparece é este:

Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 2 path $

Fala Antonio, de boa ?

Cara, minha sugestão, se possível é testar outra api, essa ai parece estar zuada, já vi isso rolar aqui antes cara.

A galera no geral acaba testando com:

https://pokeapi.co/ https://rickandmortyapi.com/ http://www.omdbapi.com/

Beleza Mateus, vou tentar isso. Obrigado.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software