Подтвердить что ты не робот

Получение заголовков от ответа в залпе

Я работаю с Volley, я хочу сделать запрос на сервер, который возвращает мне JSON в "допустимый уровень" (я вижу его в веб-браузере). Моя проблема в том, что сервер также возвращает мою информацию в заголовках, которую мне нужно получить в моем приложении, но я не могу получить заголовки из запроса.

Я искал долгое время, но не нашел ничего полезного (Onlye добавляет данные в заголовок запроса, но не получает данные из ответа заголовка)

Кто-нибудь знает, как это реализовать?

4b9b3361

Ответ 1

Чтобы получить заголовки, вам нужно переопределить parseNetworkResponse() в вашем запросе.

например, JsonObjectRequest:

public class MetaRequest extends JsonObjectRequest {

    public MetaRequest(int method, String url, JSONObject jsonRequest, Response.Listener
            <JSONObject> listener, Response.ErrorListener errorListener) {
        super(method, url, jsonRequest, listener, errorListener);
    }

    public MetaRequest(String url, JSONObject jsonRequest, Response.Listener<JSONObject>
            listener, Response.ErrorListener errorListener) {
        super(url, jsonRequest, listener, errorListener);
    }

    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString = new String(response.data,
                    HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET));
            JSONObject jsonResponse = new JSONObject(jsonString);
            jsonResponse.put("headers", new JSONObject(response.headers));
            return Response.success(jsonResponse,
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JSONException je) {
            return Response.error(new ParseError(je));
        }
    }
}

Ответ 2

Это пример работы с данными и заголовками JSONArray.

Сначала создайте собственную реализацию типа пользовательского запроса:

public class JsonRequest extends JsonObjectRequest {

    public JsonRequest(int method, String url, JSONObject jsonRequest, Response.Listener
            <JSONObject> listener, Response.ErrorListener errorListener) {
        super(method, url, jsonRequest, listener, errorListener);
    }

    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString = new String(response.data,
                    HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET));

            JSONObject jsonResponse = new JSONObject();
            jsonResponse.put("data", new JSONArray(jsonString));
            jsonResponse.put("headers", new JSONObject(response.headers));

            return Response.success(jsonResponse,
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JSONException je) {
            return Response.error(new ParseError(je));
        }
    }
}

и в вашем запросе:

JsonRequest request = new JsonRequest
        (Request.Method.POST, URL_API, payload, new Response.Listener<JSONObject>() {

            @Override
            public void onResponse(JSONObject response) {
                try {
                    JSONArray data = response.getJSONArray("data");
                    JSONObject headers = response.getJSONObject("headers");
                } catch (JSONException e) {
                    Log.e(LOG_TAG, Log.getStackTraceString(e));
                }
            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e(LOG_TAG, Log.getStackTraceString(error));
            }
        });

Подробнее о реализации собственного пользовательского запроса в документации Volley Внедрение пользовательского запроса.

Ответ 3

если запрос возвращает json, вы должны иметь возможность читать его нормально, если проблема не из json, а не из приложения Android.

вот пример обработки запросов

 RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
    JsonArrayRequest getRequest = new JsonArrayRequest(Request.Method.GET, "http://yourlink+parameters", new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray response) {
            List<YourObject> reservations = null;
            try {

                YourObject= new ArrayList<YourObject>();
                for (int i = 0; i < response.length(); i++) {
                    JSONObject obj = response.getJSONObject(i);
                   YourObjectr = new YourObject(obj.getInt("id"), obj.getInt("user_id"),format.parse(obj.getString("date")), obj.getString("address"), obj.getString("description"));
                        }

                    } catch (ParseException e) {
                        e.printStackTrace();
                    }

                }

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
            if (volleyError.networkResponse != null && volleyError.networkResponse.data != null) {
                VolleyError error = new VolleyError(new String(volleyError.networkResponse.data));
                volleyError = error;
                Log.i("error", "error :" + volleyError.getMessage());
                try {
                    JSONObject obj = new JSONObject(volleyError.getMessage());
                    if (obj.getString("error").equals("token_expired")) {
                        Intent i = new Intent(MainActivity.this, LoginActivity.class);
                        startActivity(i);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }

            } else {
                new AlertDialog.Builder(MainActivity.this)
                        .setTitle("connection problem")
                        .setMessage("check your connection")
                        .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {
                            }
                        })
                        .setIcon(android.R.drawable.ic_dialog_alert)
                        .show();
            }
        }
    });

    queue.add(getRequest);

Ответ 4

Я хочу использовать заголовки и данные в вызывающем объекте, но не могу их использовать, пожалуйста, не могли бы вы помочь.

private void jsonParse(String email, String password) {
    final String url = " http://10.232.119.132:51360/aprm-portal/Login";
    final HashMap<String, String> KeyVal = new HashMap<String, String>();
    HashMap<String, String> params = new HashMap<String, String>();
    params.put("user", email);
    params.put("password", password);
    final JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url,new JSONObject(params),
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    Log.d("value of token is ", response.toString());
                    //i want to use headers and data here to pass to another activity.
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(MainActivity.this, "The username or password is incorrect", Toast.LENGTH_SHORT).show();
            counter--;
            LoginAttempt.setText("No Of Attempts Remaining: " + String.valueOf(counter));
            if(counter == 0){
                Login.setEnabled(false);
            }
            Log.e("Password is missing","Some Error Naveen Babu");
            Log.e("onErrorResponse", error.toString());
            error.printStackTrace();
            try {
                String response = new String(
                        error.networkResponse.data,
                        HttpHeaderParser.parseCharset(error.networkResponse.headers));

                Log.e(TAG,error.networkResponse.allHeaders.toString());
                Log.e(TAG,response);

            } catch (UnsupportedEncodingException e) {
                Log.e(TAG,e.getMessage());
            }
        }
    }) {
        @Override
        protected Response parseNetworkResponse(NetworkResponse response) {
            try {
                List<Header> headers = response.allHeaders;
                for(Header header: headers){
                    Log.e(TAG,"Name " + header.getName() + " Value " + header.getValue());
                }
                String json = new String(
                        response.data,
                        HttpHeaderParser.parseCharset(response.headers));
                return Response.success(
                        new JSONObject(json),
                        HttpHeaderParser.parseCacheHeaders(response));

            } catch (UnsupportedEncodingException e) {
                return Response.error(new ParseError(e));
            } catch (JSONException e) {
                return Response.error(new ParseError(e));
            }
        }

    };
    mQueue.add(request);
}

}