如何从 OkHttp 解析 XML return?
How to parse XML return from OkHttp?
这是我的 OkHttp Post 使用 OkHttp 的 Async Get 的表单参数方法
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();
}
}
我目前正在测试它是否有效不幸的是我收到了 return 的
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
这是我在 activity 上的 onCreate 上使用的启动整个过程的方法:
private Connection connect = Connection.getInstance();
connect.postGetCountries(new GetCountriesCallback());
我不明白为什么 InputStream 会关闭。
可能会发生两件事。首先,您只能阅读正文一次。如果您想多次读取它,则需要将结果存储在某个地方。您正在阅读正文两次,一次在这里 --
Log.d(Connection.TAG_RETURN, response.body().string());
然后在这里 --
InputStream is = response.body().byteStream();
List test = connectionParser.parse(is, "op");
当您开始解析时,您已经用完了流中的可用输入。快速解决方案是删除日志语句。
另一件可能让您绊倒或将来可能让您绊倒的事情是 onResponse
即使在 HTTP 返回错误代码的情况下也会被调用。您应该检查 Response
的 code()
or isSuccesful()
方法来决定是否应该尝试解析响应。
这是我的 OkHttp Post 使用 OkHttp 的 Async Get 的表单参数方法
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();
}
}
我目前正在测试它是否有效不幸的是我收到了 return 的
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
这是我在 activity 上的 onCreate 上使用的启动整个过程的方法:
private Connection connect = Connection.getInstance();
connect.postGetCountries(new GetCountriesCallback());
我不明白为什么 InputStream 会关闭。
可能会发生两件事。首先,您只能阅读正文一次。如果您想多次读取它,则需要将结果存储在某个地方。您正在阅读正文两次,一次在这里 --
Log.d(Connection.TAG_RETURN, response.body().string());
然后在这里 --
InputStream is = response.body().byteStream();
List test = connectionParser.parse(is, "op");
当您开始解析时,您已经用完了流中的可用输入。快速解决方案是删除日志语句。
另一件可能让您绊倒或将来可能让您绊倒的事情是 onResponse
即使在 HTTP 返回错误代码的情况下也会被调用。您应该检查 Response
的 code()
or isSuccesful()
方法来决定是否应该尝试解析响应。