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}]"