0

我正在尝试制作一个 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)

我希望你能帮助我解决我的问题。

4

1 回答 1

1

你回来了:Access denied这意味着你的 if 语句返回 false。我离开了PHP很长一段时间,但if($tag='login')看起来不对,你的意思是if($tag=='login')

在 Java 上,赋值=总是返回 true,不确定这在 PHP 上的行为是否不同。

PS:如果你期望 JSON,你也应该返回一个有效的 json 错误对象而不是一个Access Denied字符串。例如,让您的 json 响应包含"status"withsuccessfailure简单地检查。这将很容易区分成功响应或失败响应。

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";
} 
于 2013-04-02T17:52:52.913 回答