У меня есть API. Он возвращает 404, когда он не содержит данных в базе данных. Retrofit 2 возвращает нулевой ответ, когда мой API возвращает 404 в качестве кода ответа.
Активность штрих-кода:
LnkBarcodeBaptizeCheckModel lnkModel = new LnkBarcodeBaptizeCheckModel();
List<String> bap_barcodes = new ArrayList<String>();
bap_barcodes.add(barcode);
lnkModel.bap_barcodes = bap_barcodes;Call<LnkBarcodeBaptizeCheckResponseModel> lnkCall = apiInterface.CheckLnkBarcodeBaptizeTable(lnkModel);
LnkBarcodeBaptizeCheckResponseModel lnkResponse = new MainAynscTask<LnkBarcodeBaptizeCheckResponseModel>().execute(lnkCall).get();
Клиент:
private static Retrofit retrofit = null;
public static Retrofit getClient() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
Gson gson = new GsonBuilder().create();
retrofit = new Retrofit.Builder()
.baseUrl("http://localserver/IndustrialApplicationsAPI/api/")
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build();
return retrofit;
}
}
Почтовый метод:
@POST("CuringPhase/CheckLnkBarcodeBaptizeTable")
Call<LnkBarcodeBaptizeCheckResponseModel> CheckLnkBarcodeBaptizeTable(@Body LnkBarcodeBaptizeCheckModel trcModel);
Вызов дооснащения:
public class MainAynscTask<T> extends AsyncTask<Call<T>, Void, T> {
@Override
protected T doInBackground(Call<T>... call) {
T responseModel = null;
try {
responseModel = call[0].execute().body();
} catch (IOException e) {
System.out.println("Call error: " + e.getLocalizedMessage());
}
return responseModel;
}
@Override
protected void onPostExecute(T result) {
super.onPostExecute(result);
//how i will pass this result where i called this task?
}
}
На самом деле я получаю ответ, но он не анализируется.
{"responseCode":404,"data":[],"error":{"errorCode":404,"errorDesc":"Не найдено!"}} <-- END HTTP (тело 81 байт)
API Response:
{
"responseCode": 404,
"data": [
],
"error": {
"errorCode": 404,
"errorDesc": "Not found!"
}
}
Какова причина?
Кстати, он анализирует ответ, когда я просто меняю код ответа на 200.
Код ответа 404 означает, что приложение смогло связаться с данным сервером, но сервер не смог найти запрошенное. Могу ли я предложить вам взглянуть на параметры вашего запроса API и как бэкэнд обрабатывает эти запросы?
Отредактировано:
Вы можете проанализировать свой ответ об ошибке (если вы его отправляете), используя JSONObject
JSONObject erroObj = new JSONObject(response.errorBody().string());
// or if you have an custom error model class then do this
Gson gson = new Gson();
Type type = new TypeToken<YourErrorResponseClass>() {}.getType();
YourErrorResponseClass errorResponse =
gson.fromJson(response.errorBody(),type);
Я надеюсь, это то, что вы искали
Я разработал этот API. Когда API не может найти данные в базе данных, он отвечает 404. Я хотел бы проанализировать ответ API. Но, насколько я понимаю, Retrofit автоматически возвращает null, когда он сталкивается с кодом ответа 404. Потому что, когда я меняю код ответа на 200, даже если API не может найти данные в базе данных.
Пожалуйста, уточните вашу конкретную проблему или предоставьте дополнительную информацию, чтобы выделить именно то, что вам нужно. Как сейчас написано, трудно точно сказать, о чем вы спрашиваете.