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 получавам "резултат": "нулево"

Екранът на пощальона с 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
Е Request.Method.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
Вашата версия на пощальона е различна от моята. Основният раздел с данни за формуляр, 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"){
......

Благодаря много на BKS!!!

person dvdciri    schedule 03.10.2015
comment
Радвам се, че проблемът ви е разрешен :) ето още една екранна снимка drive.google.com/ файл/d/0B2HGUM4c0YwpeE9YemdsZTA4Qk0/. Освен това аз съм BNK, а не BKS (хаха) - 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