【问题标题】:How to parse XML return from OkHttp?如何解析来自 OkHttp 的 XML 返回?
【发布时间】:2015-10-06 04:00:08
【问题描述】:

这是我使用 OkHttp 的 Async Get 的 OkHttp Post 表单参数方法

public Call postGetCountries(Callback callback) {
    RequestBody body = new FormEncodingBuilder()
        .add("op", "op")
        .build();

    Log.d(TAG_PARAMS, "op=sgetcountrylist, app_type=1");

    Request request = new Request.Builder()
        .url(GATEWAY_URL)
        .post(body)
        .build();

    Call call = CLIENT.newCall(request);
    call.enqueue(callback);

    return call;
}

这是我的自定义回调。

private class GetCountriesCallback implements Callback {
    @Override
    public void onFailure(Request request, IOException e) {
        Log.e("OkHttp", e.getMessage());
    }

    @Override
    public void onResponse(Response response) throws IOException {
        Log.d("PASSED", "PASS");
        Log.d(Connection.TAG_RETURN, response.body().string());

        try {
            InputStream is = response.body().byteStream();
            List test = connectionParser.parse(is, "op");

        } catch (XmlPullParserException e) {
            Log.e("PARSE ERROR", e.getMessage());
        }
    }
}

这是我实例化的解析方法。

public List parse(InputStream in, String op) throws XmlPullParserException, IOException {
    try {
        XmlPullParser parser = Xml.newPullParser();
        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
        parser.setInput(in, null);
        parser.nextTag();
        return readFeed(parser, op);
    } finally {
        in.close();
    }
}

我目前正在测试它是否有效,不幸的是我收到了退货

10-06 11:54:42.492 6336-6892/ D/PASSED: PASS
10-06 11:54:42.692 6336-6892/ E/PARSE ERROR: Invalid stream or encoding: java.io.IOException: closed (position:START_DOCUMENT null@1:1) caused by: java.io.IOException: closed

这是我在活动上的 onCreate 上使用的来启动整个过程:

private Connection connect = Connection.getInstance();
connect.postGetCountries(new GetCountriesCallback());

我不明白为什么 InputStream 会被关闭。

【问题讨论】:

    标签: java android okhttp android-xmlpullparser


    【解决方案1】:

    可能会发生两件事。首先,您只能阅读正文一次。如果您想多次阅读它,则需要将结果存储在某处。您正在阅读正文两次,一次在这里--

    Log.d(Connection.TAG_RETURN, response.body().string());
    

    然后在这里 --

    InputStream is = response.body().byteStream();
    List test = connectionParser.parse(is, "op");
    

    当您开始解析时,您已经用尽了流中的可用输入。快速的解决方案是删除日志语句。

    另一件可能会绊倒您或将来可能会绊倒您的是onResponse,即使在 HTTP 返回错误代码的情况下也会调用。您应该检查Responsecode()isSuccesful() 方法来决定是否应该尝试解析响应。

    【讨论】:

    • 这将返回带有 的 xml 作为 <和>如何解决这个问题?
    猜你喜欢
    • 2015-06-13
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 2013-11-20
    • 2016-12-17
    • 1970-01-01
    相关资源
    最近更新 更多