我使用Slim框架使用GET
方法在Android中执行REST API。我在检索表的所有值时没有任何问题,例如cars
。
当我尝试通过name
访问Car
的{{1}}时出现问题。我在Slim框架上创建了方法,它完美地运行:
获取方法
id
如果我把网址放在我的浏览器上:
$app->get("/cars/:idCar",function($idCar) use($app)
{
try{
$connection = getConnection();
$dbh = $connection->prepare("SELECT name FROM cars WHERE idCar = ?");
$dbh->bindParam(1,$idCar);
$dbh->execute();
$car = $dbh->fetchObject();
$connection = null;
header("HTTP/1.1 200");
header("Content-Type:application/json; charset=utf-8");
echo json_encode($car,JSON_UNESCAPED_UNICODE );
}catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
});
它回到我身边:
http://IP of my computer/project/cars/1
所以在{"name":"Car1"}
方法中没有任何问题。
当我尝试执行GET
时遇到的问题,因为我遇到了我必须做的事情。我现在拥有的:
AsyncTask中的HttpGet方法
HttpGet
它给了我一些问题:
class FindCar extends AsyncTask<Integer, Integer, Void> {
protected void onPreExecute(){
}
protected Void doInBackground(Integer... idCar) {
String url = "http://IP of my computer/project/cars/" + idCar[0].intValue();
HttpClient httpClient = new DefaultHttpClient();
HttpGet method = new HttpGet(url);
method.setHeader("content-type", "application/json");
try {
HttpResponse resp = httpClient.execute(method);
String respStr = EntityUtils.toString(resp.getEntity());
JSONArray respJSON = new JSONArray(respStr);
for (int i = 0; i < respJSON.length(); i++) {
JSONObject obj = respJSON.getJSONObject(i);
String name = obj.getString("name");
}
} catch (Exception ex) {
}
return null;
}
protected void onProgressUpdate(){
}
protected void onPostExecute(){
}
}
吗? JSONArray
的{{1}} name
之后获得id
之后,如何将其从Car
退回? AsyncTask
来设置AsyncTask
的价值吗?提前致谢!
答案 0 :(得分:1)
我使用类似的东西:
public function getCarsById($id) {
$stmt = $this->conn->prepare("SELECT name FROM cars WHERE idCar = ?");
$stmt->bind_param("s", $id);
if ($stmt->execute()) {
$car= $stmt->get_result()->fetch_assoc();
$stmt->close();
return $car;
} else {
return NULL;
}
}
关于java类,我使用快速令人难以置信的Retrofi,可以使用同步和异步。
答案 1 :(得分:1)
您不需要JSONArray(因为响应中没有方括号)!请尝试代替
JSONArray respJSON = new JSONArray(respStr);
for (int i = 0; i < respJSON.length(); i++) {
JSONObject obj = respJSON.getJSONObject(i);
String name = obj.getString("name");
}
以下内容:
JSONObject respJSON = new JSONObject(respStr);
String name = respJSON.getString("name");
至于返回结果 - 将它从doInBackground返回到onPostExecute方法,然后将其存储在某个地方(由于onPostExecute在UI线程上运行,因此可以在屏幕上显示它)。要从doInBackground返回值,请将AsyncTask<Integer, Integer, Void>
的最后一个类型参数从Void
更改为其他类型。
最佳做法是不要使用AsyncTask并且不要手动解析JSON(如果可能的话):)改造将是一个不错的选择