I created a slim framework backend support for my app and i define a function which needs to check if parameters that are going to be POSTED,matching the required parameters to be posted.Now,when i send a POST request using POSTMAN, it is executed well.But when i send request using retrofit in my android app then it the 'required parameters are missing'.
I tried converting json_decode() to decode the data when requesting parameters are passed to checkIfEmpty function.
class CheckEmptyParams{
function paramsCheck($required_params,$request,$response){
$error = false;
$error_params = '';
$request_params = $request->getParsedBody();
foreach($required_params as $param){
if(!isset($request_params[$param]) || strlen($request_params[$param])<0){
$error = true;
$error_params .= $param . ',';
}
}
if($error){
$error_detail = array();
$error_detail['error'] = true;
$error_detail['message'] = 'Required Parameters are missing- ' .substr($error_params,0,-1);
$response->write(json_encode($error_detail));
$response->withHeader('Content-Type','application/json')
->withStatus(422);
}
return $error;
}
}
$app->post('/userlogin',function(Request $request,Response $response){
$params_check = new CheckEmptyParams;
if(!$params_check->paramsCheck(array('email','password'),$request,$response)){
$request_data = $request->getParsedBody();
$email = $request_data['email'];
$password = $request_data['password'];
$db = new DbOperations;
$result = $db->userLogin($email,$password);
if($result == USER_AUTHENTICATED){
$response_data = array();
$response_data['error'] = false;
$response_data['message'] = 'User Authentication Successful';
$response->write(json_encode($response_data));
return $response->withHeader('Content-Type','application/json')
->withStatus(200);
}
else if($result == USER_NOT_FOUND){
$response_data = array();
$response_data['error'] = true;
$response_data['message'] = 'User not found';
$response->write(json_encode($response_data));
return $response->withHeader('Content-Type','application/json')
->withStatus(422);
}
else if($result == USER_PASSWORD_DO_NOT_MATCH){
$response_data = array();
$response_data['error'] = true;
$response_data['message'] = 'Password do not match';
$response->write(json_encode($response_data));
return $response->withHeader('Content-Type','application/json')
->withStatus(422);
}
$response_data = array();
$response_data['error'] = true;
$response_data['message'] = 'Some error occured';
$response->write(json_encode($response_data));
return $response->withHeader('Content-Type','application/json')
->withStatus(422);
}});
I expect the output to be false as boolean value returned by this function when sending POST request using retrofit.
Android code -
public interface ApiServices {
@Headers({"Content-Type:application/json"})
@FormUrlEncoded
@POST("userlogin")
Call<LoginModel> getLoginData(@Field("email")String email,
@Field("password")String password);
}
private void login(String email,String password){
final Snackbar mLoading = Snackbar.make(mFrameLayout,"Logging in...Please wait",Snackbar.LENGTH_INDEFINITE);
mLoading.show();
ApiClient.getInstance().getApi().getLoginData(email,password).enqueue(new Callback<LoginModel>() {
@Override
public void onResponse(Call<LoginModel> call, Response<LoginModel> response) {
if(getActivity()!=null && isAdded()) {
if(response.isSuccessful()){
mLoading.dismiss();
if(response.code()==200){
if(!response.body().isError()){
Snackbar.make(mFrameLayout,response.body().getMessage(),Snackbar.LENGTH_INDEFINITE).show();
}
else{
Snackbar.make(mFrameLayout,response.body().getMessage(),Snackbar.LENGTH_SHORT).show();
}
}
else if(response.code()==422){
Snackbar.make(mFrameLayout, getResources().getString(R.string.text_server_down_error), Snackbar.LENGTH_SHORT).show();
}
}
else{
mLoading.dismiss();
Snackbar.make(mFrameLayout, getResources().getString(R.string.text_server_connection_error),Snackbar.LENGTH_SHORT).show();
}
}
}
@Override
public void onFailure(Call<LoginModel> call, Throwable t) {
mLoading.dismiss();
if(getActivity()!=null&& isAdded()){
Snackbar.make(mFrameLayout, getResources().getString(R.string.text_server_connection_fail),Snackbar.LENGTH_SHORT).show();
}
}
});
}
Request is being send in POSTMAN but not in android app. Request being send in POSTMAN