Android - 带参数的 HttpGet

Android - HttpGet with parameters

我正在 Android 中使用我的 GET 方法使用 Slim 框架进行 REST API。我对检索 table 的所有值没有任何问题,例如 cars

当我尝试通过 id 访问 Carname 时出现问题。我在 Slim 框架上创建了方法并且它完美地工作:

获取方法

$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();
    }
});

如果我在浏览器上输入 url:

http://IP of my computer/project/cars/1

它 return对我来说:

{"name":"Car1"}

所以在GET方法中没有任何问题。


问题出在我尝试执行 HttpGet 时,因为我无法执行必须执行的操作。我现在拥有的:

AsyncTask 中的 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(){
   }
}

它给了我一些问题:

提前致谢!

我用的是这样的:

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 class,我用的是Retrofi,速度非常快,可以用同步异步.

您不需要 JSON 数组(因为响应中没有方括号)!请尝试代替

      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");

至于 returning 结果 - return 它从 doInBackground 到 onPostExecute 方法,然后将它存储在某个地方(你可以在屏幕上显示它,因为 onPostExecute 在 UI 线程上运行) .要从 doInBackground 中获取 return 值,将 AsyncTask<Integer, Integer, Void> 的最后一个类型参数从 Void 更改为其他类型。

最佳做法是不要使用 AsyncTask 并且不要手动解析 JSON(如果可能的话):) Retrofit 是一个不错的选择