Залп не отправлял почтовый запрос с параметрами.

У меня есть код ниже (Volley Library By Google), чтобы отправить запрос POST на мой php-сервер и в результате получить информацию. Я попробовал код без проверки isset($_POST['id']) в php и код работал нормально. Buy, когда я начал проверять, php пропустит оператор if и перейдет к else, что означает, что код не отправляет params правильно. Как я могу это исправить?

RequestQueue queue = Volley.newRequestQueue(Chat.this);
JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
        CHAT_URL_FEED, null,
        new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                Log.d("THISSSSSSSS", response.toString());
                if (response != null) {
                    parseChatJsonFeed(response);
                }
            }
        }, new Response.ErrorListener(){

    @Override
    public void onErrorResponse(VolleyError error){
        VolleyLog.d("Here", "Error: " + error.getMessage());
    }
}) {

    @Override
    protected Map<String, String> getParams() {
        Map<String, String> params = new HashMap<String, String>();
        params.put("id", id);
        return params;
    }

};

queue.add(jsonObjReq);

Я также попробовал следующий код:

RequestQueue queue = Volley.newRequestQueue(Chat.this);

        JSONObject params = new JSONObject();
        try {
            params.put("id", id);
        } catch (JSONException e) {
            e.printStackTrace();
        }


        JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
                CHAT_URL_FEED, params,
                new Response.Listener<JSONObject>() {

                    @Override
                    public void onResponse(JSONObject response) {
                        Log.d("THISSSSSSSS", response.toString());
                        if (response != null) {
                            parseChatJsonFeed(response);
                        }
                    }
                }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d("Here", "Error: " + error.getMessage());
            }
        });

        queue.add(jsonObjReq);

но я все равно получаю тот же результат.

6 ответов

Решение

Потратив немного больше времени на изучение этой проблемы, я обнаружил, что Volley не работает должным образом с JSON-запросами с POST-запросами. Пользователь @SMR предложил это в разделе комментариев моего вопроса. Я также видел похожие ответы в группах Google и в репозитории Mian на Git. Я использовал GET-запросы для передачи информации на сервер и получения JSON-фида.

StringRequest postRequest = new StringRequest(Request.Method.POST, CHAT_URL_FEED,
            new Response.Listener<String>()
            {
                @Override
                public void onResponse(String response) {
                    // response
                  Log.d("THISSSSSSSS", response.toString());
            if (response != null) {
                parseChatJsonFeed(response);
            }
            },
            new Response.ErrorListener()
            {
                @Override
                public void onErrorResponse(VolleyError error) {
                    // error
                    VolleyLog.d("Here", "Error: " + error.getMessage());
                }
            }
    ) {
        @Override
        protected Map<String, String> getParams()
        {
          Map<String, String> params = new HashMap<String, String>();
    params.put("id", id);
    return params;
        }
    };

Залп не поддерживает параметры при запросе JSONObject. Вы можете получить ответ как JSON String и преобразовать обратно в JSON, используя класс JSONObject.

Вы также можете отправить запрос String (JSON) как POST, как показано ниже.

        RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
        String requestStr = "{\n" +
                "\"id\": \"your JSON\"\n" +
                "}\n";

        JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST,"http://<Your url>",
                requestStr,new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                //Your Logic on Success
            }
        },new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                //Your Logic on Error
            }
        });

        queue.add(request);

Для отправленного POST-запроса вы можете написать собственный класс запроса, основанный на классе JsonRequest PS. Я использую этот способ в своей библиотеке (на основе Volley).

Я немного опаздываю, чтобы ответить на этот вопрос, но я думаю, что это может помочь кому-то, кто столкнулся с той же проблемой. Я просматриваю все похожие вопросы на SO, касающиеся PHP и API Volley, но не нашел удовлетворительного ответа.

Проблема в том, что вы отправляете данные из библиотеки Volley как тип контента

приложение/json

но ваш PHP-скрипт ожидает данные POST как тип контента

приложение/x-www-форма-urlencoded

В вашем PHP-скрипте сделайте следующее:

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

if ( !empty($_POST['id']) ) {
    $id = $_POST['id'];
    echo $id;
}

Теперь, если вы проверите

      if( isset($_POST['id']) ){
    echo "something";
}

теперь должно работать

Несмотря на отправку запроса в виде StringRequest, используйте JsonObjectRequest. Я уверен, что проблема исчезнет!

Поблагодаришь меня позже :)

Другие вопросы по тегам