【问题标题】:Failing to make call to API from android client无法从 android 客户端调用 API
【发布时间】:2016-11-27 21:09:52
【问题描述】:

我有一个烧瓶 RESTFUL API,它功能齐全并已部署到 heroku。我现在需要从我的 android 应用程序发出获取请求。我正在使用该库来执行此操作。

这里是调用 url https://thecaffapi.herokuapp.com/api/v1/all_stock 的 API 的代码,它返回一个 JSON 数组给安卓客户端:

client.get(baseurl + "all_stock", null, new JsonHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, JSONArray allStock) {
            for (int i = 0; i < allStock.length(); i++) {
                try {
                    JSONObject stockObject = allStock.getJSONObject(i);
                    int id = stockObject.getInt("id");
                    String stockTitle = stockObject.getString("stock_title");
                    int stockNumber = stockObject.getInt("stock_number");
                    Stock stock = new Stock(id, stockTitle, stockNumber);
                    mStockList.add(stock);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }
    });

client.get(baseurl + "all_stock", null, new JsonHttpResponseHandler() { 行已运行,但 onSuccess() 方法未运行。

当应用程序运行时,控制台会报告与 AsyncHttpClient 相关的以下内容:

V/AsyncHttpRH: Progress 216 from 216 (100%)
W/JsonHttpRH: onSuccess(int, Header[], JSONObject) was not overriden, but callback was received

为什么 onSuccess() 方法没有被覆盖并因此运行?

提前致谢,

汤姆

【问题讨论】:

    标签: android json api get asynchttpclient


    【解决方案1】:

    你的 onSucess 方法的第三个元素是你的响应应该被解析到的对象。您的响应不是数组格式,它有一个名称值对,其中值是一个数组。因此,您需要改用 JSONObject 并从中获取数组。

    client.get(baseurl + "all_stock", null, new JsonHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
            JSONArray allStock = response.getJSONArray("stock");
            for (int i = 0; i < allStock.length(); i++) {
                try {
                    JSONObject stockObject = allStock.getJSONObject(i);
                    int id = stockObject.getInt("id");
                    String stockTitle = stockObject.getString("stock_title");
                    int stockNumber = stockObject.getInt("stock_number");
                    Stock stock = new Stock(id, stockTitle, stockNumber);
                    mStockList.add(stock);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }
    });
    

    【讨论】:

    • 当我在循环中记录mStockList 的内容时,这似乎有效,它包含正确的数据。但是,当我在此块之外返回 mStockList 的内容时,它是空的。
    • 这是一个异步调用,onSucess方法在另一个线程中运行,而你的其他语句在UI线程中,所以你的调用执行时不会加载数据。
    • 谢谢老兄,救命的东西。
    • 接受它,如果它是你要找的:)
    【解决方案2】:

    似乎你必须重写确切的方法

    onSuccess(int, Header[], JSONObject), 
    

    你的看起来有点不同:

    onSuccess(int statusCode, Header[] headers, JSONArray allStock) 
    

    您的 api 为您提供 JSONObject,而不是 JSONArray

    【讨论】:

    • 你去过我在问题中列出的 url,api 响应不是 JSON 数组而不是对象。另外,还有一种方法包含 JSON 数组作为我可以覆盖的参数之一。@Ascorbin
    • 如果我改变你的建议,我会在控制台中得到以下输出:onSuccess(int, Header[], JSONObject) was not overriden, but callback was received 11-27 22:08:05.409 27015-27015/com.neutronstar.thecaffapi W/System.err: org.json.JSONException: No value for id
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2022-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    相关资源
    最近更新 更多