【发布时间】:2015-08-13 05:43:42
【问题描述】:
我一直在开发一个基本的 WAMP 数据库测试应用程序,但我遇到了一个大问题。我已经设法访问所有数据,添加新数据,甚至删除我的 MySQL 数据库上的数据,所有这些都来自我使用 php 的 Android 应用程序。但是,此时,每当我添加规范以搜索特定数据(如用户名或 ID 号)时,我的代码中都会出现错误,我无法弄清楚。
首先,这是我的 JSONParser 代码:
public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
// constructor
public JSONParser() {
}
// function get json from url
// by making HTTP POST or GET mehtod
public JSONObject makeHttpRequest(String url, String method,
List<NameValuePair> params) {
is = null;
jObj = null;
json = "";
// Making HTTP request
try {
// check for request method
if(method == "POST"){
// request method is POST
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(params));
HttpResponse httpResponse = httpClient.execute(httpPost); /////THIS WHERE THE ERROR POINTS TO
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}else if(method == "GET"){
// request method is GET
DefaultHttpClient httpClient = new DefaultHttpClient();
String paramString = URLEncodedUtils.format(params, "utf-8");
HttpGet httpGet = new HttpGet(url);
url += "?" + paramString;
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
Log.i("1 ", line);
}
is.close();
json = sb.toString();
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
}
// try parse the string to a JSON object
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
// return JSON String
return jObj;
}
}
对 JSONParser 类的调用来自一个单独的 Java 类,它扩展了 AsyncTask:
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("pid", pid));
// getting product details by making HTTP request
// Note that product details url will use GET request
JSONObject json = jsonParser.makeHttpRequest(
"http://10.0.2.2/android_connect/get_product_details.php", "GET", params);
接下来是我用来搜索特定项目信息的 PHP 文件:
<?php
require 'connect.php';
if(isset($_GET['pid'])){
$pid = trim($_GET['pid']);
if($people = $db->prepare("SELECT * FROM products WHERE pid = ?")){
$people->bind_param('i', $pid);
$people->execute();
$people->bind_result($pid, $name, $price, $desc, $created_at, $updated_at);
$product = array();
while($people->fetch()){
$product["pid"] = $pid;
$product["name"] = $name;
$product["price"] = $price;
$product["description"] = $desc;
$product["created_at"] = $created_at;
$product["updated_at"] = $updated_at;
}
$response["success"] = 1;
$response["product"] = array();
$response["product"] = $product;
echo json_encode($response);
}
else {
// failed to insert row
$response["success"] = 0;
$response["message"] = "Oops! An error occurred.";
// echoing JSON response
echo json_encode($response);
}
} else {
// required field is missing
$response["success"] = 0;
$response["message"] = "Required field(s) is missing";
// echoing JSON response
echo json_encode($response);
}
?>
PHP 已经在 Web 浏览器上进行了多次测试,并且运行良好。但是每当我使用 Android 应用程序调用它时,似乎都会失败,因为没有返回任何内容。
接下来是我的 logCat 信息:
08-13 01:16:50.259 2764-2764/com.dev.zane.testserver I/url﹕ http://10.0.2.2/UnCorkd/android_connect/get_product_details.php
08-13 01:16:50.259 2764-2764/com.dev.zane.testserver I/url﹕ http://10.0.2.2/UnCorkd/android_connect/get_product_details.php?pid=6
08-13 01:16:50.260 2764-2764/com.dev.zane.testserver D/AndroidRuntime﹕ Shutting down VM
08-13 01:16:50.261 2764-2764/com.dev.zane.testserver E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.dev.zane.testserver, PID: 2764
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
at libcore.io.IoBridge.connect(IoBridge.java:122)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
at java.net.Socket.connect(Socket.java:882)
at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
at com.dev.zane.testserver.JSONParser.makeHttpRequest(JSONParser.java:73)
at com.dev.zane.testserver.EditProductActivity$GetProductDetails$1.run(EditProductActivity.java:131)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
错误似乎是在 JSONParser 类中的行:'HttpResponse httpResponse = httpClient.execute(httpGet);'在 GET 部分下。
什么可能导致此错误? GET/POST 之间是否存在一些格式或混淆?
任何帮助都会很棒,因为我已经为此烦恼了几天,似乎无法在网上任何地方找到任何明确的答案。如果我缺少任何信息或您需要更多信息,我会很乐意添加/编辑。
谢谢!
【问题讨论】:
标签: java php android mysql wamp