Android使用Http访问并解析服务器XML数据
来源:互联网 发布:淘宝上回收手机可靠吗 编辑:程序博客网 时间:2024/06/07 23:00
okhttp
使用前需添加okhttp开源库的依赖,添加方法可参考前面这篇文章
new Thread(() -> { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("http://127.0.0.1/a.xml") .build(); try { Response response = client.newCall(request).execute(); String responceData = response.body().string(); showResponce(responceData); } catch (IOException ioex) { ioex.printStackTrace(); } // RequestBody requestBody = new FormBody.Builder() // .add("username", "admin") // .add("password", "123456") // .build(); // Request request1 = new Request.Builder() // .url("http://www.baidu.com") // .post(requestBody) // .build(); // try { // Response response = client.newCall(request1).execute(); // String responceData = response.body().string(); // } // catch (IOException ex) { // ex.printStackTrace(); // } }).start();
解析XML
假设有XML数据如下
<apps> <app> <id>1</id> <name>Google Maps</name> <version>1.0</version> </app> <app> <id>2</id> <name>Chrome</name> <version>2.1</version> </app></apps>
Pull
private void parseXMLWithPull(String responceData) { try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance().newInstance(); XmlPullParser xmlparser = factory.newPullParser(); xmlparser.setInput(new StringReader(responceData)); int eventType = xmlparser.getEventType(); String id = ""; String name = ""; String version = ""; while (eventType != XmlPullParser.END_DOCUMENT) { String nodeName = xmlparser.getName(); switch (eventType) { case XmlPullParser.START_TAG: { if("id".equals(nodeName)) { id = xmlparser.nextText(); } else if("name".equals(nodeName)) { name = xmlparser.nextText(); } else if("version".equals(nodeName)) { version = xmlparser.nextText(); } break; } case XmlPullParser.END_TAG: { if("app".equals(nodeName)) { Log.d("MainActivity", "id is" + id); Log.d("MainActivity", "name is" + name); Log.d("MainActivity", "version is" + version); } break; } default: break; } eventType = xmlparser.next(); } } catch (Exception ex) { ex.printStackTrace(); } }
SAX
//创建一个类 public class MyXMLHandler extends DefaultHandler { private String nodeName; private StringBuilder id; private StringBuilder name; private StringBuilder version; @Override public void startDocument() throws SAXException { id = new StringBuilder(); name = new StringBuilder(); version = new StringBuilder(); } //文本的起始 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { nodeName = localName; } //每个节点的起始 @Override public void characters(char[] ch, int start, int length) throws SAXException { if("id".equals(nodeName)) { id.append(ch, start, length); } else if("name".equals(nodeName)) { name.append(ch, start, length); } else if("version".equals(nodeName)) { version.append(ch, start, length); } } //每个节点文本内容的解析 @Override public void endElement(String uri, String localName, String qName) throws SAXException { if("app".equals(localName)) { Log.d("Handler", "id is" + id.toString().trim()); Log.d("Handler", "name is" + name.toString().trim()); Log.d("Handler", "version is" + version.toString().trim()); id.setLength(0); name.setLength(0); version.setLength(0); } } //每个节点的结束 @Override public void endDocument() throws SAXException { super.endDocument(); } } //文本的结束 //类的调用 private void parseXMLWithHandler(String responce) { try { SAXParserFactory factory = SAXParserFactory.newInstance(); XMLReader xmlreader = factory.newSAXParser().getXMLReader(); MyXMLHandler handler = new MyXMLHandler(); xmlreader.setContentHandler(handler); xmlreader.parse(new InputSource(new StringReader(responce))); } catch (Exception ex) { ex.printStackTrace(); } }
总结
其实,上面建立http连接的写法是有问题的。因为每次建立http连接都要重复以上代码,难免造成不必要的代码重复。我们想要的效果是:
String address = "...";String responce = HttpUtil.sendRequestAddress(address);
因此我们想到的是把http协议处理的相关方法,包装到一个类中,然后在该sendRequestAddress方法中new一个Thread即可。但是这样就不能把想要的结果返回。因此,我们这里应用一个类okhttp.Callback进行回调。
public class HttpUtil { public static void sendHttpRequest(final String address, Callback callback) { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(address) .build(); client.newCall(request).enqueue(callback); } }
其中okhttp.Callback帮我们另外启动一个子线程处理服务器返回的数据,调用时,应用以下代码即可:
HttpUtil.sendHttpRequest("http://www.baidu.com", new Callback() { @Override public void onFailure(Call call, IOException e) { ... } @Override public void onResponse(Call call, Response response) throws IOException { String responseData = response.body().string(); showResponce(responseData); } });
一个回调机制的简单例子
public interface HttpCallbackListener { void onFinish(String responce); void onError(Exception e); }
public class HttpUtil { public static void sendHttpRequest(final String add, HttpCallbackListener listener) { new Thread(() -> { //线程进行处理,处理时间不确定 .... try { if(listener != null) { listener.onFinish(responce.body().string()); //调用HttpCallbackListener中的函数 } } catch(Exception e) { if(listener != null) { listener.onError(e); //调用HttpCallbackListener中的函数 } } }).start(); } }
public class testResponce { public static showResponce(String rsponce) { ... } public static showError(Exception e) { ... } public static void main(String[] argv) { try{ HttpUtil.sendHttpRequest(add, new HttpCallbackListener() { @Override void onFinish(String responce) { showResponce(responce); //回调testResponce的函数 } @Override void onError(Exception e) { showError(e); ////回调testResponce的函数 } }); } catch(Exception e) { ... } } }
阅读全文
0 0
- Android使用Http访问并解析服务器XML数据
- android访问服务器并解析返回的XML和JSON数据
- Android访问网络:服务端返回XML或JSON格式数据,Android 进行解析并使用ListView显示
- Android-SAX解析XML文件(http访问取回服务器XML)
- Android HTTP下载XML文件并解析
- android 解析服务器数据使用json还是xml方式
- android 客户端访问自己建立的服务器并返回JSON数据进行解析学习
- Android:使用HttpClient访问HTTP/HTTPS服务器
- android中通过GET方法接收数据并通过xml解析数据,POST方法向服务器提交数据
- Android与Servlet交互:Android访问Servlet,并使用解析传回来的Json数据
- Android开发之下载Tomcat服务器的xml文件并使用SAX解析
- Android访问网络系列之--服务端返回XML或JSON格式数据,Android 进行解析并显示
- android http请求并解析返回的xml
- iPhone HTTP获得XML并使用GDataXML解析
- iPhone HTTP获得XML并使用GDataXML解析
- iPhone HTTP获得XML并使用GDataXML解析
- iPhone HTTP获得XML并使用GDataXML解析
- 解析HTTP POST方式请求的xml数据、本地XML文件数据, 并返回JSON字符串
- matplotlib模块数据可视化-多图
- C++自定义插入操作符和提取操作符
- 线性可分 与线性不可分
- HashMap
- 决策树的算法的使用
- Android使用Http访问并解析服务器XML数据
- C学习笔记20170820
- Python网络数据采集——BeautifulSoup
- HDU6152-Friend-Graph
- c++类的简单实现
- Codeforces 780G Andryusha and Nervous Barriers
- 编程之美
- es6
- 网络爬虫浅析