У меня есть приложение 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);