Android - 带参数的HttpGet

时间:2015-08-20 02:52:57

标签: android android-asynctask slim

我使用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(){ } } 吗?
  • 在我的AsyncTask中获取名称的最佳做法是什么?
  • 在我传递给JSONArray的{​​{1}} name之后获得id之后,如何将其从Car退回?
  • 我应该创建一个AsyncTask来设置AsyncTask的价值吗?

提前致谢!

2 个答案:

答案 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(如果可能的话):)改造将是一个不错的选择

相关问题