Отправка запроса POST с помощью JSONArray с использованием Volley

Я хочу отправить простой запрос POST на Android с телом, равным этому:

[ { "value": 1 } ] 

Я попытался использовать библиотеку Volley в Android, и это мой код:

 // the jsonArray that I want to POST String json = "[{\"value\": 1}]"; JSONArray jsonBody = null; try { jsonBody = new JSONArray(json); } catch (JSONException e) { e.printStackTrace(); } final JSONArray finalJsonBody = jsonBody; // starting the request final RequestQueue queue = Volley.newRequestQueue(getApplicationContext()); JsonObjectRequest request = new JsonObjectRequest(com.android.volley.Request.Method.POST,"https://...",null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Log.d("mytag", "Response is: " + response);}}, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.d("Mytag", "error");}}) { @Override protected Map<String,String> getParams() { // the problem is here... return (Map<String, String>) finalJsonBody; } @Override public Map<String, String> getHeaders() throws AuthFailureError { HashMap<String, String> params = new HashMap<String, String>(); // I put all my headers here like the following one : params.put("Content-Type", "application/json"); return params;}}; queue.add(request); 

Проблема в том, что метод getParams принимает только объект Map, так как я хочу отправить JSONArray. Итак, я обязан использовать листинг, который генерирует ошибку …

Я не знаю, как я могу исправить это Спасибо

Вы можете ссылаться на мой следующий пример кода:

UPDATE для вашей ссылки pastebin:

Поскольку сервер отвечает на JSONArray , я использую JsonArrayRequest вместо JsonObjectRequest . И не нужно больше переопределять getBody .

  mTextView = (TextView) findViewById(R.id.textView); String url = "https://api.orange.com/datavenue/v1/datasources/2595aa553d3049f0b0f03fbaeaa7ddc7/streams/9fe5edb1c76e4968bdcc9c902010bc6c/values"; RequestQueue requestQueue = Volley.newRequestQueue(this); final String jsonString = "[\n" + " {\n" + " \"value\": 1\n" + " }\n" + "]"; try { JSONArray jsonArray = new JSONArray(jsonString); JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.POST, url, jsonArray, new Response.Listener<JSONArray>() { @Override public void onResponse(JSONArray response) { mTextView.setText(response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { mTextView.setText(error.toString()); } }) { @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = new HashMap<>(); headers.put("X-OAPI-Key","TQEEGSk8OgWlhteL8S8siKao2q6LIGdq"); headers.put("X-ISS-Key","2b2dd0d9dbb54ef79b7ee978532bc823"); return headers; } }; requestQueue.add(jsonArrayRequest); } catch (JSONException e) { e.printStackTrace(); } 

Мой код работает как для официальной библиотеки волейбола Google, так и для библиотеки mcxiaoke

Если вы хотите использовать библиотеку Google , после того как вы клонируете в качестве документации Google, скопируйте папку Android из \src\main\java\com (из проекта, который вы клонировали), в \app\src\main\java\com Ваш проект как следующий снимок экрана:

Введите описание изображения здесь

build.gradle должен содержать следующие

 dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.0.1' compile 'com.google.code.gson:gson:2.3.1' } 

Если ваш проект использует библиотеку build.gradle , build.gradle будет выглядеть следующим образом (обратите внимание на dependencies ):

 apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "23.0.0" defaultConfig { applicationId "com.example.samplevolley" minSdkVersion 16 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.0.0' compile 'com.mcxiaoke.volley:library:1.0.17' compile 'com.google.code.gson:gson:2.3' } 

Я предлагаю вам создать 2 новых примерных проекта, тогда один будет использовать библиотеку Google , а другой будет использовать библиотеку mcxiaoke .

КОНЕЦ ОБНОВЛЕНИЯ

  String url = "http://..."; RequestQueue requestQueue = Volley.newRequestQueue(this); final String jsonString = "[\n" + " {\n" + " \"value\": 1\n" + " }\n" + "]"; JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { // do something... } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // do something... } }) { @Override public byte[] getBody() { try { return jsonString.getBytes(PROTOCOL_CHARSET); } catch (UnsupportedEncodingException uee) { VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", jsonString, PROTOCOL_CHARSET); return null; } } }; requestQueue.add(jsonObjectRequest); 

Следующий скриншот – это то, что получил веб-сервер на стороне сервера:

Введите описание изображения здесь