1

I am doing an android project the login API is working properly in postman but for JSON format it is showing Unexpected 'S'. My colleague told me to convert the Response in LoginRequest.java must be changed to either JSONArray or JSONObject

Here are PHP, Android JAVA codes

    <?php

include("Connection.php");

if(isset($_POST["email"]) && isset($_POST["password"]))
{

   $email=$_POST["email"];

   $password=$_POST["password"];

   $result = mysqli_query($conn, "select * from user_master where email='$email' && password='$password'");

    if(mysqli_num_rows($result) > 0)
    {   
        echo "Success";
        exit;
    }           
    else
    {   
        echo "INVALID";
        exit;
    }
}


?>

LoginRequest.java

    package com.talentakeaways.ttpms;

import com.android.volley.AuthFailureError;
import com.android.volley.Response;
import com.android.volley.toolbox.StringRequest;

import java.util.HashMap;
import java.util.Map;

/**
 * Created by chand on 15-03-2018.
 */

public class LoginRequest extends StringRequest {
    private static final String url = "http://10.26.16.22:80/ttpms/login.php";
    private Map<String, String> parameters;

    LoginRequest(String username, String password, Response.Listener<String> listener, Response.ErrorListener errorListener) {
        super(Method.POST, url, listener, errorListener);
        parameters = new HashMap<>();
        parameters.put("username", username);
        parameters.put("password", password);
    }

    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        return parameters;
    }
}

Ttpm_Login.java

    package com.talentakeaways.ttpms;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.android.volley.NetworkError;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.ServerError;
import com.android.volley.TimeoutError;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.Volley;

import org.json.JSONException;
import org.json.JSONObject;

import info.androidhive.androidsplashscreentimer.R;


public class Ttpm_Login extends AppCompatActivity {
    //declaration of edit text, button and string values
    EditText tenantname, passWord;
    Button bt_login;
    String userName, password;


    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ttpm_login);
        setTitle("Login"); //set title of the activity
        initialize();
        final RequestQueue requestQueue = Volley.newRequestQueue(Ttpm_Login.this);
        //onClickListener method for button
        bt_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //assigning String variables to the text in edit texts
                userName = tenantname.getText().toString();
                password = passWord.getText().toString();
                //Validating the String values
                if (validateUsername(userName) && validatePassword(password)) {

                    //Start ProgressDialog
                    final ProgressDialog progressDialog = new ProgressDialog(Ttpm_Login.this);
                    progressDialog.setTitle("Please Wait");
                    progressDialog.setMessage("Logging You In");
                    progressDialog.setCancelable(false);
                    progressDialog.show();

                    //Login Request from class LoginRequest
                    LoginRequest loginRequest = new LoginRequest(userName, password, new Response.Listener<String>() {
                        @Override
                        public void onResponse(String response) {
                            Log.i("Login Response", response);
                            progressDialog.dismiss();
                            try {
                                JSONObject jsonObject = new JSONObject(response);
                                //If Success then start Dashboard Activity
                                if (jsonObject.getBoolean("Success")) {

                                    Intent loginSuccess = new Intent(getApplicationContext(), Ttpm_Dashboard.class);
                                    startActivity(loginSuccess);
                                    finish();
                                }

                                //else Invalid
                                else {
                                    if (jsonObject.getString("status").equals("INVALID"))
                                        Toast.makeText(getApplicationContext(), "User Not Found", Toast.LENGTH_SHORT).show();
                                    else {
                                        Toast.makeText(getApplicationContext(), "Passwords Don't Match", Toast.LENGTH_SHORT).show();
                                    }
                                }
                            } catch (JSONException e) {
                                e.printStackTrace();
                                Log.getStackTraceString(e);
                                Toast.makeText(Ttpm_Login.this, "Bad Response from the Server", Toast.LENGTH_SHORT).show();
                            }
                        }
                    }, new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            progressDialog.dismiss();
                            if (error instanceof ServerError) {
                                Toast.makeText(Ttpm_Login.this, "Server Error", Toast.LENGTH_SHORT).show();
                            } else if (error instanceof TimeoutError) {
                                Toast.makeText(Ttpm_Login.this, "Connection Timed Out", Toast.LENGTH_SHORT).show();
                            } else if (error instanceof NetworkError) {
                                Toast.makeText(Ttpm_Login.this, "Bad Network Connection", Toast.LENGTH_SHORT).show();
                            }
                        }
                    });
                    requestQueue.add(loginRequest);
                }
            }
        });
    }

    private void initialize() {
        tenantname = findViewById(R.id.tenantname);
        passWord = findViewById(R.id.password);
        bt_login = findViewById(R.id.login);
    }

    private boolean validateUsername(String string) {
        //Validating the entered USERNAME
        if (string.equals("")) {
            tenantname.setError("Enter a Username");
            return false;
        } else if (string.length() > 50) {
            tenantname.setError("Maximum 50 Characters");
            return false;
        } else if (string.length() < 6) {
            tenantname.setError("Minimum 6 Characters");
            return false;
        }
        tenantname.setEnabled(false);
        return true;
    }

    private boolean validatePassword(String string) {
        //Validating the entered PASSWORD
        if (string.equals("")) {
            passWord.setError("Enter Your Password");
            return false;
        } else if (string.length() > 32) {
            passWord.setError("Maximum 32 Characters");
            return false;
        }
//        else if (string.length() < 8) {
//            passWord.setError("Minimum 8 Characters");
//            return false;
//        }
//
        passWord.setEnabled(false);
        return true;
    }

}

And Here is my logcat when perform login https://i.stack.imgur.com/94CGd.png

Please Help. Thanks In advance

2 Answers2

0

Your post parameters are wrong, in your backend you are expecting the key email but in android you are posting username, change username to email in app

LoginRequest(String username, String password, Response.Listener<String> listener, Response.ErrorListener errorListener) {
    super(Method.POST, url, listener, errorListener);
    parameters = new HashMap<>();
    parameters.put("email", username);
    parameters.put("password", password);
}

Since your response is a string, no need of converting it to jsonobject. Change response block like this

   LoginRequest loginRequest = new LoginRequest(userName, password, new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        Log.i("Login Response", response);
                        progressDialog.dismiss();
                        try {
                            JSONObject jsonObject = new JSONObject(response);
                            //If Success then start Dashboard Activity
                            if(jsonObject.getBoolean("success")) {

                                Intent loginSuccess = new Intent(getApplicationContext(), Ttpm_Dashboard.class);
                                startActivity(loginSuccess);
                                finish();
                            }

                            //else Invalid
                            else {
                                if (jsonObject.getString("status").equals("INVALID"))
                                    Toast.makeText(getApplicationContext(), "User Not Found", Toast.LENGTH_SHORT).show();
                                else {
                                    Toast.makeText(getApplicationContext(), "Passwords Don't Match", Toast.LENGTH_SHORT).show();
                                }
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                            Log.getStackTraceString(e);
                            Toast.makeText(Ttpm_Login.this, "Bad Response from the Server", Toast.LENGTH_SHORT).show();
                        }
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        progressDialog.dismiss();
                        if (error instanceof ServerError) {
                            Toast.makeText(Ttpm_Login.this, "Server Error", Toast.LENGTH_SHORT).show();
                        } else if (error instanceof TimeoutError) {
                            Toast.makeText(Ttpm_Login.this, "Connection Timed Out", Toast.LENGTH_SHORT).show();
                        } else if (error instanceof NetworkError) {
                            Toast.makeText(Ttpm_Login.this, "Bad Network Connection", Toast.LENGTH_SHORT).show();
                        }
                    }
                });
                requestQueue.add(loginRequest);
Navneet Krishna
  • 5,009
  • 5
  • 25
  • 44
0

For Example If you view the JSON structure, it will be something like this:

{

"results" : [ { "user_login" : "xyz", "user_login_password" : 123456 } ] }

First, convert the JSON object into JSONArray object like this:

    JSONArray jsonarr_1 = (JSONArray) jobj.get(“results”); 
 for(int i=0;i<jsonarr_1.size();i++)
{
  JSONObject jsonobj_1 = (JSONObject)jsonarr_1.get(i);
  System.out.println(“Elements under results array”);
  System.out.println(“\nuser_login: ” +jsonobj_1.get(“user_login”));
  System.out.println(“user_login_password: ” +jsonobj_1.get(“user_login_password”));
}

and send the parameter to server:

 protected Map<String, String> getParams() {

          /** Pass the parameters to according to the API.*/
            Map<String, String> params = new HashMap<String, String>();
            params.put("user_login", edt_email.getText().toString().trim());
            params.put("user_login_password", edt_password.getText().toString().trim());
            return params;
        }
    };
    /** Adding request to request queue*/
    AppController.getInstance().addToRequestQueue(jsonObjReq, cancel_login_api);
}
Android Geek
  • 8,956
  • 2
  • 21
  • 35