2
respostas

Requisição POST com envio de dois parâmetros - Retrofit

Bom dia, Estou com dificuldade de fazer funcionar uma requisição POST onde preciso enviar dois parâmetros solicitados pela API - token e shopping_list_id

Método: POST URL: /shopping-lists/info Obrigatório: bearer token

Requisição: { "shopping_list_id" : "1" }

Está é a minha requisição :

@POST("shopping-lists/info") Call infoLista(@Body JsonObject jsonToken, @Body JsonObject jsonId);

Erro:

2021-07-27 08:39:27.680 11330-11388/com.example.appmarket E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
Process: com.example.appmarket, PID: 11330
java.lang.RuntimeException: An error occurred while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:354)
    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:245)
    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:764)
 Caused by: java.lang.IllegalArgumentException: Multiple @Body method annotations found. (parameter #2)
    for method DateService.infoLista
    at retrofit2.Utils.methodError(Utils.java:54)
    at retrofit2.Utils.methodError(Utils.java:43)
    at retrofit2.Utils.parameterError(Utils.java:64)
    at retrofit2.RequestFactory$Builder.parseParameterAnnotation(RequestFactory.java:773)
    at retrofit2.RequestFactory$Builder.parseParameter(RequestFactory.java:325)
    at retrofit2.RequestFactory$Builder.build(RequestFactory.java:206)
    at retrofit2.RequestFactory.parseAnnotations(RequestFactory.java:67)
    at retrofit2.ServiceMethod.parseAnnotations(ServiceMethod.java:26)
    at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:202)
    at retrofit2.Retrofit$1.invoke(Retrofit.java:160)
    at java.lang.reflect.Proxy.invoke(Proxy.java:1006)
    at $Proxy0.infoLista(Unknown Source)
    at com.example.appmarket.asynctask.InfoListasRetrofit.doInBackground(InfoListasRetrofit.java:36)
    at android.os.AsyncTask$2.call(AsyncTask.java:333)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        ... 4 more

Pelo que entendi, se refere a ter dois Body... ok 
Então mandei um pelo @Header e outro @Body... não deu certo 
Mandei os dois como @Path - não deu certo... 

Poderia me dar uma ajuda..... 
Obrigada
2 respostas
@Override
    protected Object doInBackground(Object[] objects) {
        User_DAO userDAO = Market_BD.getInstance(context).getUserDAO();
        JsonObject jsonToken = new JsonObject();
        jsonToken.addProperty("token", userDAO.consultaToken());
        JsonObject jsonId = new JsonObject();
        jsonId.addProperty("shopping_list_id", id);
        DateService service = new MarketRetrofit().getDateService();
        Call<InfoLista> call = service.infoLista(jsonToken, jsonId);
        call.enqueue(new Callback<InfoLista>() {
            @Override
            public void onResponse(Call<InfoLista> call, Response<InfoLista> response) {
                InfoLista body = response.body();
                if(response.isSuccessful()){
                    int i = 0;
                    Log.i("Dados", body.getShoppingLists().get(i).getProducts().get(i).getName() );
                }
            }

            @Override
            public void onFailure(Call<InfoLista> call, Throwable t) {

            }
        });

        return null;
    }

Julia, tudo bem ?

Você tem algumas coisas que precisa pensar pra solucionar esse problema:

  • Só podemos mandar um objeto via body

Com essa informação, você tem 2 opções:

  1. Criar um objeto, que tenha ambos conteudos, essa abordagem se chama DTO, dessa maneira você consegue ter 1 único objeto passando tudo
  2. Mandar o seu token via Header e o conteudo iria no corpo normalmente, essa abordagem é bem comum também.