【问题标题】:Android - HttpGet with parametersAndroid - 带参数的 HttpGet
【发布时间】:2015-11-13 12:55:03
【问题描述】:

我正在使用我的 GET 方法在 Android 中使用 Slim 框架执行 REST API。我对检索表的所有值没有任何问题,例如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();
    }
});

如果我把网址放在我的浏览器上:

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

它返回给我:

{"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(){
   }
}

它给了我一些问题

  • 我应该为一个属性创建一个JSONArray 吗?
  • 在我的 AsyncTask 中获取名称的最佳做法是什么?
  • 在通过我的Carid 获得name 并传递给我的AsyncTask 后,如何将其从AsyncTask 中返回?
  • 我应该创建一个NameValuePair 来设置我的id 的值吗?

提前致谢!

【问题讨论】:

    标签: android android-asynctask slim


    【解决方案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&lt;Integer, Integer, Void&gt; 的最后一个类型参数从 Void 更改为其他类型。

    最佳实践是不要使用 AsyncTask 并且不要手动解析 JSON(如果可能的话):) 改造将是一个不错的选择

    【讨论】:

    • 非常感谢!这正是我想要的! ;)
    【解决方案2】:

    我使用这样的东西:

    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,速度非常快,可以使用 同步异步

    【讨论】:

    • 正如我在问题中所说,使用GET方法我没有任何问题,只是在Android HttpGet中。无论如何,感谢您提供的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 2022-08-18
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    相关资源
    最近更新 更多