我正在尝试创建一个Android登录应用程序,正如您所看到的,您可以使用登录按钮登录。它将向服务器发送POST请求,服务器将返回JSON数据。我的应用程序接收数据但无法解析它。在此之后它没有做任何事情,但我首先想让这个工作。这是我的代码:
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代码:
<?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';
}
?>
来自服务器的示例JSON响应:
{"tag":"login","success":"0","error":"10"}
我从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)
我希望你能解决我的问题。
答案 0 :(得分:1)
您回来了:Access denied
意味着您的if语句返回false。我已经离PHP
很长一段时间,但if($tag='login')
看起来不对,你的意思是if($tag=='login')
吗?
在Java上,=
的赋值总是返回true,不确定这在PHP上是否有所不同。
PS:如果你期望JSON,你还应该返回一个有效的json错误对象而不是Access Denied
字符串。例如,让您的json响应包含"status"
success
或failure
来简单检查。这样可以轻松区分成功的响应或失败的响应。
PPS:我看到您尝试使用$response = array("tag" => $tag, "success" => 0, "error" => 0);
,所以基本上在那里添加错误代码或类似代码并返回而不是字符串。
修改强> 你正在做两个请求,你知道吗?
// 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();
}
更改并尝试将其合并:
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";
}