Залп parseNetworkResponse, как перехватить статус и изменить ответ в onResponse - PullRequest
1 голос
/ 08 января 2020

У меня есть приложение Android, в котором я получаю токен Firebase и отправляю его на наш частный сервер.

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

Я использую Volley, чтобы сделать запрос к веб-сервису sendFirebaseTokenToServer. Если токен успешно вставлен в БД на сервере, то WS возвращает строку «ОК». Так что, если приложение Android получает OK, то этот факт помечается меткой времени на стороне приложения Android.

Когда я делаю запрос от вызывающего Activity для отправки токена, я использую интерфейс с 2 методы обратного вызова для передачи результата обратно в вызывающую активность. Я передаю этот интерфейс в качестве параметра классу, который выполняет запрос залпа.

public interface IResult {
        public void notifySuccess(JSONObject response, String responseString);

        public void notifyError(VolleyError error);
    }

.

public void sendFireBaseTokenToServerWAPI() {

        Log.e(TAG, "inside sendFireBaseTokenToServerWAPI (FireBaseRefreshTokenIntentService)");

        WebServicesForWebApi webServices = new WebServicesForWebApi(FireBaseRefreshTokenIntentService.this, new WebServicesForWebApi.IResult() {
            @Override
            public void notifySuccess(JSONObject response, String responseString) {



                Log.e(TAG, "formatted result for sendFireBaseTokenToServerWAPI = " + response);




            }

            @Override
            public void notifyError(VolleyError error) {

                Toast.makeText(FireBaseRefreshTokenIntentService.this, "There was a problem in sendFireBaseTokenToServerWAPI", Toast.LENGTH_LONG).show();

            }
        });


        String url = appObj.loginValidate.getCustomerUrlFromDB() + "/api/*****/RegisterFCM?format=json";




        JSONObject js = new JSONObject();
        try {


            js.put("***Id", "0");
            js.put("***Id", mToken);


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

        webServices.makeWebApiPostCustomerServer(url, js);

    }

.

Вот проблема. Новый разработчик сказал, что этот метод, который отправляет токен FireBase на сервер, не должен получать тело JSON обратно в ответе. Он утверждает, что рекомендуется проверять состояние http в parseNetworkResponse. если статус 200, то у нас есть успех.

Проблема возникает, когда я проверяю статус http в методе parsenetworkResponse. я проверяю, не было ли оно 200, и равняется ли response.data.length 0. Это означает, что веб-служба была успешной, а в ответе нет данных. (другие вызовы методов могут возвращать тело json с данными, но это не так). Как только я могу увидеть 200 и длину 0, я использую интерфейс для связи с вызывающим действием из метода parseNetworkResponse. Это работает, но затем, после запуска parseNetworkresponse, запускается volley onResponse, который также имеет обратный вызов интерфейса, последний возвращает нулевое значение, как и ожидалось.

, поэтому в вызывающей операции я получаю 2 обратных вызова, 1 с ок и второй с нулем. это кажется неправильным.

Как я могу проверить состояние ответа сети на 200, а также обнаружить, что тело ответа (JSON) не имеет тела изнутри onResponse?

Кстати, веб-вызов используется для возврата OK или NOTOK на основании того, был ли токен вставлен в БД сервера. Этот OK / NOTOK был получен обратным вызовом интерфейса только в onResponse. кажется, переопределив parseNetworkResponse и onResponse, я получаю 2 обратных вызова.

вот код залпа, который делает запрос. вы можете увидеть интерфейс в обоих методах.

Так что я думаю, что здесь есть конфликт идей. Я полагаю, что приемлемо отправить ответ json независимо от того, возвращены данные или нет, поскольку я рассматриваю это как доказательство того, что в БД что-то вставлено. Мой коллега считает, что я должен проверить статус, и если после его звонка произойдет ошибка sql, он отправит обратно 400 с ошибкой в ​​теле. - это звучит нормально?

JsonObjectRequestWithNull jsonObjReq = new JsonObjectRequestWithNull(
                                Request.Method.POST, url, js,
                                new Response.Listener<JSONObject>() {
                                    @Override
                                    public void onResponse(JSONObject response) {
                                        Log.e(TAG, "inside makeWebApiPostCustomerServer onResponse. response for " + url + " = " + response);







                                        iResult.notifySuccess(response, null);


                                    }
                                }, new Response.ErrorListener() {

                            @Override
                            public void onErrorResponse(VolleyError error) {

                                Log.e(TAG, "inside makeWebApiPostCustomerServer onErrorResponse.");


                                getAuthenticationTokensForCustomerServerNew(new IResultForCustomerToken() {
                                    @Override
                                    public void notifySuccess(JSONObject response, String responseString) {

                                        Log.e(TAG, "got new tokens after being rejected once. (used username and pass)");
                                        makeWebApiPostSecondAndFinalTimeForCustomerServer(url, js);

                                    }

                                    @Override
                                    public void notifyError(VolleyError error) {

                                        Log.e(TAG, "There is a problem getting new token for customer server after using username and password");

                                    }
                                });





                            }
                        }) {



                            @Override
                            protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
                                int mStatusCode = response.statusCode; //200


                                Log.e(TAG, "inside parseNetworkResponse mStatusCode = " + mStatusCode);
                                Log.e(TAG, "inside parseNetworkResponse response = " + response);

                                Log.e(TAG, "inside parseNetworkResponse response.data.length = " + response.data.length);
                                Log.e(TAG, "inside parseNetworkResponse response.toString = " + response.data.toString());




                                if(response.data.length == 0 && mStatusCode == 200) {

                                    Log.e(TAG, "response.data == null and statusCode == 200");

                                     JSONObject js = new JSONObject();

                                    try {

                                        Log.e(TAG, "about to populate json object");

                                        js.put("result", "ok");

                                        Log.e(TAG, "json object populated");

                                        Log.e(TAG, "about to call iResult for calling activity");

                                        iResult.notifySuccess(js, null);
                                        Log.e(TAG, "just called iResult = ok");

                                    } catch (Exception e) {
                                    }



                                }else{

                                    Log.e(TAG, "response.data != null and statusCode != 200");

                                }

                                return super.parseNetworkResponse(response);
                            }

                            /**
                             * Passing some request headers
                             */
                            @Override
                            public Map<String, String> getHeaders() throws AuthFailureError {
                                HashMap<String, String> headers = new HashMap<String, String>();
                                headers.put("Content-Type", "application/json; charset=utf-8");
                                //headers.put("Content-Type", "application/x-www-form-urlencoded");
                                headers.put("Authorization", "Bearer " + accessToken);
                                return headers;
                            }




                        };

                        jsonObjReq.setRetryPolicy(new DefaultRetryPolicy(4000, 0, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

                        RequestQueue queue = appObj.getRequestQueue();
                        queue.add(jsonObjReq);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...