Android Volley с REST Api - POST не вставляет в дБ и реагирует неправильно

Я использую https://github.com/mevdschee/php-crud-api в качестве REST Api для доступа к моей базе данных MySQL. Для доступа к данным из Android-приложения я использую Volley lib. Все работает нормально, кроме POST (создание нового элемента в db). Но вместо того, чтобы создать новый элемент, я получаю, что JSON будет содержать все элементы (выглядят как результат GET), а элемент не создается в дБ.

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Log.d(TAG, "APP START");

    tv = findViewById(R.id.textView);
    buttonPost = findViewById(R.id.buttonPost);
    buttonGet = findViewById(R.id.buttonGet);

    Calendar cal = Calendar.getInstance();
    SimpleDateFormat sd1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    current_date = sd1.format(new Date(cal.getTimeInMillis()));
    Log.d(TAG, "current_date = " + current_date);

    cache = new DiskBasedCache(getCacheDir(), 1024 * 1024); // 1MB cap

    mRequestQueue = new RequestQueue(cache, network);
    mRequestQueue.start();


    buttonGet.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Log.d(TAG, "ButtonGet pressed");

            tv.setText("");
            getRest();

        }
    });

    buttonPost.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Log.d(TAG, "ButtonPost pressed");

            tv.setText("");
            postRest();
        }
    });


}

получить отдых()

tv.append("REST API - reading data via GET " + "\n");
    JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, endpointUrl, null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {

            try {

                JSONObject vancuraLevel1 = response.getJSONObject("restdemo");
                JSONArray vancuraLevel2 = vancuraLevel1.getJSONArray("records");
                int JSONlenght2 =  vancuraLevel2.length();
                Log.d("JSON", "JSONlenght2  = " + JSONlenght2 );

                for(int n = 0; n < JSONlenght2; n++) {

                    Log.d("JSON", "looping " + n );

                    JSONArray vancuraLevel3 = vancuraLevel2.getJSONArray(n);
                    int JSONlenght3 =  vancuraLevel3.length();

                    String index = vancuraLevel3.getString(0);
                    String datum = vancuraLevel3.getString(1);
                    String subjekt = vancuraLevel3.getString(2);
                    String ovoce = vancuraLevel3.getString(3);

                    Log.d("JSON", "result datum" + datum + " subjekt = " + subjekt);
                    tv.append("Data : " + index + "/" + datum + "/" + subjekt + "/" + ovoce + "\n");

                }

            } catch (JSONException e) {
                e.printStackTrace();
            }

        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e(TAG, "Volley REST error " + error.toString());

            tv.append("ERROR " +  error.toString() +"\n");
        }
    });

    // fire Volley request
    mRequestQueue.add(jsObjRequest);

postRest () {

final String whatToInsert = "foo subjekt " + current_date;

    // POST - insert data

    tv.append("REST API - inserting data via POST - payload = " + whatToInsert +"\n");


    StringRequest postRequest = new StringRequest(Request.Method.POST, endpointUrl, new Response.Listener<String>() {

        @Override
        public void onResponse(String response) {

            // response
            Log.d("Response", response);
            // tv.append(current_date + "\n");
            tv.append("response = " + response);
        }
    },

            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    // error
                    Log.e("Error.Response", error.getMessage());
                    tv.append("ERROR " +  error.toString() +"\n");
                }
            })
    {

        @Override
        protected Map<String, String> getParams()
        {
            Map<String, String>  params = new HashMap<String, String>();
            //params.put("index", "NULL");
            params.put("datum", "2017-12-30");
            params.put("subjekt", whatToInsert);
            params.put("ovoce", "2");

            return params;
        }
    };  
   // fire Volley request
    mRequestQueue.add(postRequest);

Результат ПОЛУЧИТЬ - ОК Android Volley с REST Api - POST не вставляет в дБ и реагирует неправильно Результат POST - неисправность Android Volley с REST Api - POST не вставляет в дБ и реагирует неправильно

проект доступен на https://github.com/fanysoft/AndroidRESTapi

в качестве обходного пути я использовал другой URL-адрес для метода POST (с другим сервером PHP}, и он работает нормально. В Интернете есть много сообщений о том, что у Volley проблемы с POST.

Josef Vancura 26.09.2018 14:08

Привет, автор бэкэнда здесь (мевдщее). Если вы записываете внутренние вызовы с помощью отладочного прокси (например, Charles) и публикуете их, я могу помочь вам увидеть, что происходит не так, но, похоже, вы просто выполняете запросы GET вместо запросов POST. Ваше здоровье!

mevdschee 29.09.2018 01:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
539
2

Ответы 2

Если внимательно присмотреться к коду, метод GET возвращает ответ JSONObject, а метод POST возвращает ответ Нить. Строковый ответ метода POST очень правильный, и он дает точно такой же результат, что и результат метода GET, все, что вам нужно сделать, это преобразовать ответ String в объект JSON, у вас будет тот же JSONObject, что и метод GET

JSONObject jsonObject = new JSONObject(response);

Затем вы можете проанализировать объект для получения результата

Решено отключением кеша Volley

getRequest.setShouldCache(false);

postRequest.setShouldCache(false);

Другие вопросы по теме