Android Volley JsonObjectRequest не отправляет параметры

Я пытаюсь отправить JsonObjectRequest на свой сервер с некоторыми параметрами, но похоже, что параметры не поступают на сервер. Прежде чем публиковать на SO, я пробую все предложения, найденные в Google, но никто не работает нормально.

Это код моего JsonObjectRequest:

RequestQueue queue = MySingleVolley.getInstance(ctx).
            getRequestQueue();

    JsonObjectRequest jsObjRequest = new JsonObjectRequest(method,url,null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    Log.d("REQUEST_JSON_TO_SERVER", "Success: " + response.toString());
                }
            },new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d("REQUEST_JSON_TO_SERVER", "Error: " + error);
                }
            }){
                    @Override
                    public Map<String, String> getHeaders() throws AuthFailureError {
                        HashMap<String, String> headers = new HashMap<String, String>();
                        headers.put("Content-Type", "application/json");
                        return headers;
                    }
                    @Override
                    protected Map<String, String> getParams() {
                        return params;
                    }
            };

    MySingleVolley.getInstance(ctx).addToRequestQueue(jsObjRequest);

И это мой параметр и другие:

String url =  "url";

    //create the hashMap of parameters
    database_zappapp db = new database_zappapp(getApplicationContext());
    db.open();
    HashMap<String, String> params = new HashMap<>();
    params.put("action","myAction");
    params.put("nomeutente", db.getUsernameLogged());
    params.put("token", token);
    db.close();


    //Send the request to the server
    Global.RequestJsonToServer(getApplicationContext(), url, Request.Method.POST, params);

Заранее спасибо за помощь!

Изменить 2

Я изменил свои параметры при создании строки jsonBody:

JSONObject jsonObject = new JSONObject();
    try {
        jsonObject.put("action","gcmUserRegister");
        jsonObject.put("nomeutente",db.getUsernameLogged());
        jsonObject.put("token",token);
    }catch(JSONException e){
        e.printStackTrace();
    }
    String requestBody = jsonObject.toString();
    db.close();

и мой запрос с getBody():

JsonObjectRequest jsObjRequest = new JsonObjectRequest(method,url,null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    Log.d("REQUEST_JSON_TO_SERVER", "Success: " + response.toString());
                }
            },new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d("REQUEST_JSON_TO_SERVER", "Error: " + error);
                }
            }){
                    @Override
                    public Map<String, String> getHeaders() throws AuthFailureError {
                        HashMap<String, String> headers = new HashMap<>();
                        headers.put("Content-Type", "application/json");
                        return headers;
                    }
                    @Override
                    public byte[] getBody() {
                        try {
                            return requestBody == null ? null : requestBody.getBytes("utf-8");
                        } catch (UnsupportedEncodingException uee) {
                            VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s",
                                    requestBody, "utf-8");
                            return null;
                        }
                    }
            };

Но уже не работал! знак равно

Экран почтальона:

Пользователь не найден означает, что он входит в оператор if, и поэтому он работает ... с Android я получаю «результат»: «null»

Экран почтальона с app/json:

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


person dvdciri    schedule 02.10.2015    source источник
comment
Если вы используете официальную библиотеку залпов Google, в вашем отредактированном запросе params должно быть JSONObject вместо HashMap. Надеюсь это поможет!   -  person BNK    schedule 03.10.2015
comment
Взгляните на мои ответы здесь и здесь и здесь. Надеюсь это поможет!   -  person BNK    schedule 03.10.2015
comment
В моем отредактированном ЗАПРОСЕ параметры уже являются JsonObject и еще не работают. Я смотрю на ваши ответы! Спасибо   -  person dvdciri    schedule 03.10.2015
comment
Получено какое-либо сообщение об ошибке или нет? Кроме того, используйте Postman в Chrome для проверки отправки запросов на ваш сервер.   -  person BNK    schedule 03.10.2015
comment
Ошибка не получена, я получаю только json, напечатанный на моем сервере, но покажите мне, что это не работает, потому что я не вхожу в if. Я уже пробовал с почтальоном на хроме, и php работает отлично!   -  person dvdciri    schedule 03.10.2015
comment
Взгляните на мою правку 2, пожалуйста...   -  person dvdciri    schedule 03.10.2015
comment
Опубликуйте скриншот своего почтальона и как вы инициировали параметры в отредактированном запросе. Если URL-адрес вашего сервера доступен в Интернете, опубликуйте его, чтобы я мог проверить.   -  person BNK    schedule 03.10.2015
comment
Значение метода равно 1?   -  person BNK    schedule 03.10.2015
comment
Что вы имеете в виду под значением 1? Теперь выкладываю свой скрин почтальона   -  person dvdciri    schedule 03.10.2015
comment
Первый параметр в методе JsonObjectRequest, если POST должен быть равен 1. Если 0, то это запрос GET.   -  person BNK    schedule 03.10.2015
comment
Запрос.Метод.POST..   -  person dvdciri    schedule 03.10.2015
comment
В Postman вторым ключом является имя пользователя, однако в вашем Android это nomeutente. Почему так?   -  person BNK    schedule 03.10.2015
comment
Это не имеет значения, я неправильно набрал почтальона.. но, как я пишу, тот факт, что результатом является noUserFound, означает, что он входит в оператор if на сервере, поэтому параметры действия поступают.. вместо этого в android нет   -  person dvdciri    schedule 03.10.2015
comment
Поместите jsonObject в 3-й параметр JsonObjectRequest и удалите (комментарий) getBody(), запустите приложение, проверьте, работает оно или нет.   -  person BNK    schedule 03.10.2015
comment
Это еще не работает ... может быть, есть какая-то проблема с заголовком типа контента, отправленным на сервер, и типом контента страницы php? может быть? Потому что, если я изменю тип содержимого почтальона в application/json, это не сработает...   -  person dvdciri    schedule 03.10.2015
comment
Ваша версия почтальона отличается от моей. Вкладка body с данными формы, это JSON?   -  person BNK    schedule 03.10.2015
comment
ммм, я пытаюсь отправить параметры в необработанном виде, например application/json, и получить тот же результат, что и Android. Я опубликую вам экран   -  person dvdciri    schedule 03.10.2015
comment
Я вижу, возможно, параметры должны быть отправлены в виде данных формы вместо json, интересно, это составные данные формы или нет?   -  person BNK    schedule 03.10.2015
comment
Я только что проверил URL-адрес вашего сервера с данными формы, он также NULL, здесь скриншот drive.google.com/file/d/0B2HGUM4c0Ywpak1qWVcyVFBFUDQ/   -  person BNK    schedule 03.10.2015


Ответы (2)


Я нашел решение!

Проблема была на сервере, а не в клиенте, я получал данные с помощью POST, но от клиента я отправлял объект json, поэтому мой новый php:

$data = json_decode(file_get_contents('php://input'), true);

//echo "Action: ".$action;
//Registrazione del token
if($data['action'] == "gcmUserRegister"){
......

Большое спасибо БКС!!!

person dvdciri    schedule 03.10.2015
comment
Рад, что ваша проблема решена :) вот еще один скриншот drive.google.com/ файл/d/0B2HGUM4c0YwpeE9YemdsZTA4Qk0/. Более того, я БНК, а не БКС (смеется) - person BNK; 03.10.2015

Измените эту часть кода:

 `JsonObjectRequest jsObjRequest = new JsonObjectRequest(method,url,null ...`

К этому:

 `JsonObjectRequest jsObjRequest = new JsonObjectRequest(method,url,yourparams..`

Причина: если вы используете конструкторы Volley по умолчанию, это способ отправки параметров на сервер.

person Max Pinto    schedule 02.10.2015