Reputation: 645
I'm trying to make an android login app, and as you can see you can login using the login button. It will send a POST request to the server and the server will return JSON data. My app receives the data but cannot parse it. It doesn't do anything after this, but I first want to get this working. Here is my code:
MainActivity.java
public class MainActivity extends Activity {
private static String readAll(Reader rd) throws IOException {
StringBuilder sb = new StringBuilder();
int cp;
while ((cp = rd.read()) != -1) {
sb.append((char) cp);
}
return sb.toString();
}
public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
InputStream is = new URL(url).openStream();
try {
BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
String jsonText = readAll(rd);
JSONObject json = new JSONObject(jsonText);
return json;
} finally {
is.close();
}
}
private EditText inpUsername;
private EditText inpPassword;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
inpUsername = (EditText) findViewById(R.id.inpUsername);
inpPassword = (EditText) findViewById(R.id.inpPassword);
}
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void checkLogin(View v)
{
new DoLoginAsyncTask().execute();
}
private class DoLoginAsyncTask extends AsyncTask<String, Void, String> {
private ProgressDialog LoadingDialog;
String response = "";
String LoadingDialogLoggingIn = getResources().getString(R.string.logging_in);
@Override
protected void onPreExecute() {
LoadingDialog = new ProgressDialog(MainActivity.this);
LoadingDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
LoadingDialog.setMessage(LoadingDialogLoggingIn);
LoadingDialog.setCancelable(false);
LoadingDialog.show();
}
@Override
protected String doInBackground(String... params) {
String username = inpUsername.getText().toString();
String password = inpPassword.getText().toString();
// Creating HTTP client
HttpClient httpClient = new DefaultHttpClient();
// Creating HTTP Post
HttpPost httpPost = new HttpPost("http://mysite/");
// Building post parameters
// key and value pair
List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(2);
nameValuePair.add(new BasicNameValuePair("tag", "login"));
nameValuePair.add(new BasicNameValuePair("username", username));
nameValuePair.add(new BasicNameValuePair("password", password));
// Url Encoding the POST parameters
try {
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));
} catch (UnsupportedEncodingException e) {
// writing error to Log
e.printStackTrace();
response = response+"printStackTrace";
}
// Making HTTP Request
try {
HttpResponse response = httpClient.execute(httpPost);
// writing response to log
Log.d("Http Response:", response.toString());
} catch (ClientProtocolException e) {
// writing exception to log
e.printStackTrace();
response = response+"ClientProtocolException";
} catch (IOException e) {
// writing exception to log
e.printStackTrace();
response = response+"IOException";
}
try{
JSONObject json = readJsonFromUrl("http://mysite/");
System.out.println(json.toString());
System.out.println(json.get("id"));
} catch(IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
return response;
}
@Override
protected void onPostExecute(String result) {
LoadingDialog.dismiss();
LoadingDialog = null;
if(response != "") {
Toast.makeText(getApplicationContext(), response, Toast.LENGTH_LONG).show();
}
}
}
}
PHP code on the server:
<?php
header('Content-type: application/json; charset=utf-8');
if (isset($_REQUEST['tag']) && $_REQUEST['tag'] != '') {
$tag = $_REQUEST['tag'];
require 'config.php';
$response = array("tag" => $tag, "success" => 0, "error" => 0);
mysql_connect("$mysql_host", "$mysql_username", "$mysql_password") or die(mysql_error());
mysql_select_db("$mysql_db_name") or die(mysql_error());
if($tag='login') {
if(isset($_REQUEST['username']) && $_REQUEST['username'] != '' && isset($_REQUEST['password']) && $_REQUEST['password'] != '') {
$username = $_REQUEST['username'];
$password = $_REQUEST['password'];
$hash = md5($password);
$search = mysql_query("SELECT * FROM users WHERE username='".$username."' AND password='".$hash."' AND active='1'") or die(mysql_error());
$match = mysql_num_rows($search);
$result = mysql_fetch_array($search);
if($match > 0) {
$response['tag']="login";
$response['success']="1";
$response['error']="0";
$response['uid']=$result['id'];
$response['username']=$result['username'];
$response['name']=$result['name'];
$response['surname']=$result['surname'];
$response['email']=$result['email'];
} else {
$response['tag']="login";
$response['success']="0";
$response['error']="10";
}
} else {
//username or password not filled in
$response['tag']="login";
$response['success']="0";
$response['error']="11";
}
}
echo json_encode($response);
} else {
echo 'Access denied';
}
?>
example JSON response from server:
{"tag":"login","success":"0","error":"10"}
The error I get from LogCat:
org.json.JSONException: Value Access of type java.lang.String cannot be converted to JSONObject
at org.json.JSON.typeMismatch(JSON.java:107)
at org.json.JSONObject.<init>(JSONObject.java:158)
at org.json.JSONObject.<init>(JSONObject.java:171)
at com.example.myapp.MainActivity.readJsonFromUrl(MainActivity.java:56)
at com.example.myapp.MainActivity$DoLoginAsyncTask.doInBackground(MainActivity.java:147)
at com.example.myapp.MainActivity$DoLoginAsyncTask.doInBackground(MainActivity.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
I hope you can help me with my problem.
Upvotes: 0
Views: 3444
Reputation: 57672
You are getting back: Access denied
meaning that your if statement returns false. I am out of PHP
for quite a while but if($tag='login')
looks wrong, did you mean if($tag=='login')
?
On Java an assignment with =
would always return true, not sure if this behaves different on PHP.
PS: If you expect JSON, you should also return a valid json error object instead of a Access Denied
String. For example having your json response contain "status"
with success
or failure
to simply check for. This would make it easy to differ between an successful response or a failed one.
PPS: I see you tried that with $response = array("tag" => $tag, "success" => 0, "error" => 0);
so basically add the error code or similar there and return that instead of the string.
Edit You are doing two request, you know that?
// Making HTTP Request
try {
// Fist request! With your tag and username and more
HttpResponse response = httpClient.execute(httpPost);
// writing response to log
Log.d("Http Response:", response.toString());
} catch (ClientProtocolException e) {
// writing exception to log
e.printStackTrace();
response = response+"ClientProtocolException";
} catch (IOException e) {
// writing exception to log
e.printStackTrace();
response = response+"IOException";
}
try{
// second request! No tag, username...
JSONObject json = readJsonFromUrl("http://mysite/");
System.out.println(json.toString());
System.out.println(json.get("id"));
} catch(IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
Change that and try to combine it:
try {
// Fist request! With your tag and username and more
HttpResponse response = httpClient.execute(httpPost);
// writing response to log
Log.d("Http Response:", response.toString());
// try to parse it to json
JSONObject json = new JSONObject(response.toString());
// do what ever you like...
} catch (ClientProtocolException e) {
// writing exception to log
e.printStackTrace();
response = response+"ClientProtocolException";
} catch (IOException e) {
// writing exception to log
e.printStackTrace();
response = response+"IOException";
}
Upvotes: 1