Volley JsonObjectRequest Параметры сообщения больше не работают

Как об использовании каких-либо разрывов вообще, никаких флажков отмены и никаких дополнительных проверок условий. Эта версия просто взрывает переменные цикла (делает их Number.MAX_VALUE), когда условие встречается, и заставляет все петли прекращать элегантно.

// No breaks needed
for (var i = 0; i < 10; i++) {
  for (var j = 0; j < 10; j++) {
    if (condition) {
      console.log("condition met");
      i = j = Number.MAX_VALUE; // Blast the loop variables
    }
  }
}

Был найден аналогичный ответ для вложенного типа типа декрементирования петли, но это работает для вложенных циклов инкрементного типа, не требуя рассмотрения значения конца цикла для простых циклов.

Другой пример:

// No breaks needed
for (var i = 0; i < 89; i++) {
  for (var j = 0; j < 1002; j++) {
    for (var k = 0; k < 16; k++) {
      for (var l = 0; l < 2382; l++) {
        if (condition) {
          console.log("condition met");
          i = j = k = l = Number.MAX_VALUE; // Blast the loop variables
        }
      }
    }
  }
}
29
задан Community 23 May 2017 в 11:47
поделиться

11 ответов

Я закончил тем, что вместо этого использовал StringRequest от Volley, потому что я использовал слишком много драгоценного времени, пытаясь заставить JsonObjectRequest работать.

RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://myserveraddress";

StringRequest strRequest = new StringRequest(Request.Method.POST, url,
                new Response.Listener<String>()
                {
                    @Override
                    public void onResponse(String response)
                    {
                        Toast.makeText(getApplicationContext(), response, Toast.LENGTH_SHORT).show();
                    }
                },
                new Response.ErrorListener()
                {
                    @Override
                    public void onErrorResponse(VolleyError error)
                    {
                        Toast.makeText(getApplicationContext(), error.toString(), Toast.LENGTH_SHORT).show();
                    }
                })
        {
            @Override
            protected Map<String, String> getParams()
            {
                Map<String, String> params = new HashMap<String, String>();
                params.put("tag", "test");
                return params;
            }
        };

queue.add(strRequest);

Это сработало для меня. Это так же просто, как JsonObjectRequest, но вместо этого используется строка.

33
ответ дан Joshua C. 23 May 2017 в 11:47
поделиться

Вам просто нужно сделать JSONObject из вашего HashMap параметров:

String url = "https://www.youraddress.com/";

Map<String, String> params = new HashMap();
params.put("first_param", 1);
params.put("second_param", 2);

JSONObject parameters = new JSONObject(params);

JsonObjectRequest jsonRequest = new JsonObjectRequest(Request.Method.POST, url, parameters, new Response.Listener<JSONObject>() {
    @Override
    public void onResponse(JSONObject response) {
        //TODO: handle success
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        error.printStackTrace();
        //TODO: handle failure
    }
});

Volley.newRequestQueue(this).add(jsonRequest);
37
ответ дан Philippe 23 May 2017 в 11:47
поделиться

У меня была похожая проблема, но я обнаружил, что проблема была не на стороне клиента, а на стороне сервера. Когда вы отправляете JsonObject, вам нужно получить объект POST следующим образом (на стороне сервера):

В PHP:

$json = json_decode(file_get_contents('php://input'), true);
11
ответ дан Pang 23 May 2017 в 11:47
поделиться

Использование объекта JSONObject для отправки параметров означает, что параметры будут в формате JSON в теле запроса HTTP POST:

Map<String, String> params = new HashMap<String, String>();
params.put("tag", "test");
params.put("tag2", "test2");
JSONObject jsonObj = new JSONObject(params);

Создаст этот объект JSON и вставит его в тело запроса HTTP POST. :

{"tag":"test","tag2":"test2"}

Затем сервер должен декодировать JSON, чтобы понять эти параметры POST.

Но обычно параметры HTTP POST записываются в теле как:

tag=test&tag2=test2

Но СЕЙЧАС здесь возникает вопрос, почему Volley устанавливается таким образом?

Сервер читает HTTP POST метод должен по стандарту всегда пытаться читать параметры также в JSON (кроме простого текста), и поэтому сервер, который не выполняет, является плохим сервером?

Или вместо этого тело HTTP POST с параметрами в JSON не чего обычно хочет сервер?

2
ответ дан Adriano G. V. Esposito 23 May 2017 в 11:47
поделиться

Вы можете использовать StringRequest, чтобы делать то же самое, что и с JsonObjectRequest, при этом все еще имея возможность легко отправлять параметры POST. Единственное, что вам нужно сделать, это создать JsonObject из строки запроса, которую вы получаете, и оттуда вы можете продолжить, как если бы это был JsonObjectRequest.

StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        try {
                            //Creating JsonObject from response String
                            JSONObject jsonObject= new JSONObject(response.toString());
                            //extracting json array from response string
                            JSONArray jsonArray = jsonObject.getJSONArray("arrname");
                            JSONObject jsonRow = jsonArray.getJSONObject(0);
                            //get value from jsonRow
                            String resultStr = jsonRow.getString("result");
                        } catch (JSONException e) {

                        }

                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                }){
                    @Override
                    protected Map<String, String> getParams() throws AuthFailureError {
                        Map<String,String> parameters = new HashMap<String,String>();
                        parameters.put("parameter",param);

                        return parameters;
                    }

                };
                requestQueue.add(stringRequest);
8
ответ дан itamar8910 23 May 2017 в 11:47
поделиться

Используйте вспомогательный класс CustomJsonObjectRequest, упомянутый здесь .

и реализовать как это -

CustomJsonObjectRequest request = new CustomJsonObjectRequest(Method.POST, URL, null, new Response.Listener<JSONObject>() {
    @Override
    public void onResponse(JSONObject response) {
        Toast.makeText(getActivity(), response.toString(), Toast.LENGTH_SHORT).show();
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        Toast.makeText(getActivity(), "Error.", Toast.LENGTH_SHORT).show();
    }
}) {
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        Map<String, String> params = new HashMap<String, String>();
        params.put("id", id);
        params.put("password", password);
        return params;
    }
};
VolleySingleton.getInstance().addToRequestQueue(request);
1
ответ дан Community 23 May 2017 в 11:47
поделиться

Вы можете сделать это следующим образом:

CustomRequest request = new CustomRequest(Request.Method.POST, url, null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
           // Toast.makeText(SignActivity.this, response.toString(), Toast.LENGTH_SHORT).show();

            Log.d("response",""+response.toString());

            String status =  response.optString("StatusMessage");
            String actionstatus = response.optString("ActionStatus");
            Toast.makeText(SignActivity.this, ""+status, Toast.LENGTH_SHORT).show();
            if(actionstatus.equals("Success"))
            {
                Intent i = new Intent(SignActivity.this, LoginActivity.class);
                startActivity(i);
                finish();
            }
            dismissProgress();

        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(SignActivity.this, "Error."+error.toString(), Toast.LENGTH_SHORT).show();
            Log.d("response",""+error.toString());
            dismissProgress();
        }
    }) {
        @Override
        public String getBodyContentType() {
            return "application/x-www-form-urlencoded; charset=UTF-8";
        }

        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("Email", emailval);
            params.put("PassWord", passwordval);
            params.put("FirstName", firstnameval);
            params.put("LastName", lastnameval);
            params.put("Phone", phoneval);
            return params;
        }

    };
    AppSingleton.getInstance(SignActivity.this.getApplicationContext()).addToRequestQueue(request, REQUEST_TAG);

согласно CustomRequest по ссылке ниже Volley JsonObjectRequest Отправить запрос не работает

1
ответ дан William 23 May 2017 в 11:47
поделиться

Может помочь кому-то и сэкономить время на размышления. У меня была похожая проблема, код сервера искал заголовок Content-Type. Он делал это следующим образом:

if($request->headers->content_type == 'application/json' ){ //Parse JSON... }

Но Волли отправлял заголовок так:

'application/json; charset?utf-8'

Изменение кода сервера на это помогло:

if( strpos($request->headers->content_type, 'application/json') ){ //Parse JSON... 
1
ответ дан kuffel 23 May 2017 в 11:47
поделиться

Это работает.
Я проанализировал отклик объекта json, используя это: - работает как шарм.

String  tag_string_req = "string_req";
        Map<String, String> params = new HashMap<String, String>();
        params.put("user_id","CMD0005");

        JSONObject jsonObj = new JSONObject(params);
String url="" //your link
        JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST,
                url, jsonObj, new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                Log.d("responce", response.toString());

                try {
                    // Parsing json object response
                    // response will be a json object
                    String userbalance = response.getString("userbalance");
Log.d("userbalance",userbalance);
                    String walletbalance = response.getString("walletbalance");
                    Log.d("walletbalance",walletbalance);

                } catch (JSONException e) {
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(),
                            "Error: " + e.getMessage(),
                            Toast.LENGTH_LONG).show();
                }

            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getApplicationContext(),
                        error.getMessage(), Toast.LENGTH_SHORT).show();

            }
        });

        AppControllerVolley.getInstance().addToRequestQueue(jsonObjReq, tag_string_req);

удачи! спокойной ночи!

0
ответ дан Debasish Ghosh 23 May 2017 в 11:47
поделиться

«... Изначально это работало на меня… Потом вдруг оно перестало работать, и я не внес никаких изменений в код»

если вы не внесли никаких изменений в ранее работающий код, тогда я предлагаю проверить другие параметры, такие как URL , так как IP-адрес может измениться, если вы используете свой собственный компьютер в качестве сервера!

-1
ответ дан Charden Daxicen 23 May 2017 в 11:47
поделиться

У меня была похожая проблема. Но я обнаружил, что проблема не в серверной части, а в кеше. Вы должны очистить кэш RequestQueue.

RequestQueue requestQueue1 = Volley.newRequestQueue(context);
requestQueue1.getCache().clear();
1
ответ дан pacholik 23 May 2017 в 11:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: