Как POST JSONObject / JSONArray в POST Retrofit? - PullRequest
0 голосов
/ 11 июля 2020

Я хочу отправить эти данные на сервер как JSONObject

    {
    "userId": "5f06ca75ce77e8e2cdd2f320",
    "services": [
        {
        "serviceId": "5eeb4d5f2d4f7288d8959f68"
        },

        {
        "serviceId": "5eeb5b942b567b6a8fee6b00"
        }
    ]
}

это моя кнопка, где я создаю указанный выше формат, и он отлично создает

  binding.btnFeedback.setOnClickListener(v -> {

        JSONObject jsonOBJ = new JSONObject();
        try {
            JSONArray list = new JSONArray();
            jsonOBJ.put("userId", "5f06ca75ce77e8e2cdd2f320");


            String[] dataArray = {"5eeb4d5f2d4f7288d8959f68","5eeb5b942b567b6a8fee6b00"};
            for( int i=0;i<dataArray.length;i++) {
                JSONObject internalObject = new JSONObject();
                internalObject.put("serviceId",dataArray[i]);
                list.put(internalObject);
            }
            jsonOBJ.put("services", list);

        } catch (JSONException e) {
            Toast.makeText(getActivity(), ""+e.getMessage(), Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        }
        mViewModel.apiCallArray(jsonOBJ);

    });
}

это это мой блок модернизации

APIService services = RetroClass.getApiClient(My.token).create(APIService.class);
    Call<TestResponse> allUsers = services.test(list);
    allUsers.enqueue(new Callback<TestResponse>() {
        @Override
        public void onResponse(@NotNull Call<TestResponse> call, @NotNull Response<TestResponse> response) {
            progressBar.setValue(8);

            if(response.isSuccessful()){
                showToast(getApplication(),""+response);
            }
            else {
                try {
                    JSONObject jObjError = new JSONObject(response.errorBody().string());
                    showToast(getApplication().getApplicationContext(),jObjError.getString("msg"));
                } catch (Exception e) {
                    Log.d("", e.getMessage());
                    showToast(getApplication(),""+e.getMessage());
                }
            }

        }

        @Override
        public void onFailure(Call<TestResponse> call, Throwable t) {
            progressBar.setValue(8);
            showToast(getApplication().getApplicationContext(),t.getMessage());
        }
    });

И это мой класс интерфейса

@POST("profile/update-interests")
Call<TestResponse> test(@Body JSONObject jsonArray);

Сообщение об ошибке в logcat: I / okhttp.OkHttpClient: <- 422 Unprocessable Entity Content-Type : application / json</p>

Но когда я нажимаю кнопку публикации, он возвращает нулевое тело ответа и показывает ошибку «Нет значения для msg». кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 12 июля 2020

У меня была такая же проблема, и я исправил ее после изменения JSONObject на JsonObject и JSONArray на JsonArray. Вот документация . так что просто обновите этот раздел, и я надеюсь, что он будет работать.

binding.btnFeedback.setOnClickListener(v -> {

    JsonObject jsonOBJ = new JsonObject();
    try {
        JsonArray list = new JsonArray();
        jsonOBJ.put("userId", "5f06ca75ce77e8e2cdd2f320");


        String[] dataArray = {"5eeb4d5f2d4f7288d8959f68","5eeb5b942b567b6a8fee6b00"};
        for( int i=0;i<dataArray.length;i++) {
            JSONObject internalObject = new JSONObject();
            internalObject.put("serviceId",dataArray[i]);
            list.put(internalObject);
        }
        jsonOBJ.put("services", list);

    } catch (JSONException e) {
        Toast.makeText(getActivity(), ""+e.getMessage(), Toast.LENGTH_SHORT).show();
        e.printStackTrace();
    }
    mViewModel.apiCallArray(jsonOBJ);

});

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...