Android Volley с REST Api - POST не будет вставляться в дБ и отвечать неправильно - PullRequest
0 голосов
/ 24 сентября 2018

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


}

getRest ()

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);

Результат GET - все в порядке enter image description here Результат POST - ошибка enter image description here

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

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Решено отключением кэша залпа

getRequest.setShouldCache(false);

postRequest.setShouldCache(false);
0 голосов
/ 24 сентября 2018

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

JSONObject jsonObject = new JSONObject(response);

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

...