У меня проблема с вызовом Retrofit. У меня был вызов для отправки данных на сервер, вызов возвращает мне ответ 200, что означает, что вызов выполнен успешно, но он не сохраняет никаких данных в базе данных и возвращает сообщение «запрос пуст» в трассировке стека сервера. Получение данных в ответ.
Вызов интерфейса
@Headers({"org-id: vuk"})
@POST("/dmp/user/loginwithotp")
Call<ResponseAPI> signInWithOTP(@Body RequestBody jsonObject);
Вызов модернизации
OkHttpClient client = new OkHttpClient.Builder()
.connectionSpecs(Arrays.asList(ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT))
.addInterceptor(loggingInterceptor)
.addNetworkInterceptor(new CacheInterceptor(mContext))
.connectTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl )
.addConverterFactory(GsonConverterFactory.create(new Gson()))
.client(client)
.build();
return retrofit;
}
public static VuAPIServices geVuAPIServices() {
VuAPIServices vuAPIServices = getRetrofit().create(VuAPIServices.class);
return vuAPIServices;
}
Код для отправки запроса на вызов и ответа на вызов в действии
try {
JSONObject jsonObject = new JSONObject();
jsonObject.put("mobileNumber", mobileNumber);
RequestBody body = RequestBody.create(json.toString(), MediaType.parse("application/json;charset=UTF-8"));
Call<ResponseAPI> responseAPICall = ApiClient.geVuAPIServices().signInWithOTP(body);
responseAPICall.enqueue(new Callback<ResponseAPI>() {
@Override
public void onResponse(Call<ResponseAPI> call, retrofit2.Response<ResponseAPI> response) {
if (!response.isSuccessful()) {
Log.e("TAG", "response: "+new Gson().toJson(response.body()) );
}
}
@Override
public void onFailure(Call<ResponseAPI> call, Throwable t) {
Log.e("TAG", "onFailure: "+t.toString() );
}
});
} catch (JSONException e) {
e.printStackTrace();
}
}
Ответ POJO
@SerializedName("flag")
private int flag;
@SerializedName("message")
private String message;
@SerializedName("status")
private Boolean status;
@SerializedName("otp")
private String otp;
@SerializedName("locked")
private Boolean locked;
@SerializedName("firstTimeLogin")
private Boolean firstTimeLogin;
@SerializedName("firstLogin")
private Boolean firstLogin;
Getter and Setters...
Изображение почтальона
Что я должен изменить в своем коде? Я приветствую каждый намек. Статус, который я получаю, равен 200, но с пустым запросом на стороне сервера.
Обновлено с результатом ответа
E/TAG: response: {"firstLogin":false,"firstTimeLogin":false,"flag":0,"fromInternalApp":false,"locked":false,"mobileNumber":"4455332266","noToken":false,"status":false}
Да, сохраняется при отправке запроса от почтальона
Любой, кто может помочь мне в этом?
Это может быть связано с тем, что вы отправляете объект json. Вместо этого вы можете попробовать создать объект запроса и отправить его:
public class RequestObject {
private String mobileNumber;
public RequestObject(String mobileNumber) {
this.mobileNumber = mobileNumber;
}
public String getMobileNumber() {
return mobileNumber;
}
public setMobileNumber(String mobileNumber) {
this.mobileNumber = mobileNumber;
}
}
А затем отправьте его в запросе:
@Headers({"org-id: vuk"})
@POST("/dmp/user/loginwithotp")
Call<ResponseAPI> signInWithOTP(@Body RequestObject requestObject); // here
Я пробовал все, чтобы заставить его работать, но он возвращает на сервер только пустой запрос, в то время как тот же вызов запроса с тем же параметром в почтальоне работает нормально и сохраняет данные в базе данных
Я решил свою проблему, это была проблема, из-за которой мне нужно было отправить хост в заголовке перехватчика okhttp.
httpClient.addInterceptor(new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request original = chain.request();
Request request = original.newBuilder()
.addHeader("Content-Type", "application/json")
.addHeader("User-Agent", System.getProperty("http.agent"))
.addHeader("Host", "localhost:8080")
.method(original.method(), original.body())
.build();
return chain.proceed(request);
}
});
Вскоре после того, как я добавил это в перехватчик, проблема была решена, и ответ был успешно возвращен.
E/TAG: response: {"firstLogin":false,"firstTimeLogin":false,"flag":1,"fromInternalApp":false,"locked":false,"message":"true OTP sent successfully on mobile number for Initial Login","noToken":false,"otp":"573287","status":false}
Спасибо @rya за ваши ценные усилия, которые вы пытались мне помочь.
Сохраняются ли данные при отправке запроса от почтальона?