Я использую 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);
Результат ПОЛУЧИТЬ - ОК
Результат POST - неисправность

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





Если внимательно присмотреться к коду, метод GET возвращает ответ JSONObject, а метод POST возвращает ответ Нить. Строковый ответ метода POST очень правильный, и он дает точно такой же результат, что и результат метода GET, все, что вам нужно сделать, это преобразовать ответ String в объект JSON, у вас будет тот же JSONObject, что и метод GET
JSONObject jsonObject = new JSONObject(response);
Затем вы можете проанализировать объект для получения результата
Решено отключением кеша Volley
getRequest.setShouldCache(false);
postRequest.setShouldCache(false);
в качестве обходного пути я использовал другой URL-адрес для метода POST (с другим сервером PHP}, и он работает нормально. В Интернете есть много сообщений о том, что у Volley проблемы с POST.