【android开发-24】android中访问http协议网络以及解析xml格式数据的详细讲解

1,访问http协议网络

在Android中,使用HttpURLConnection访问网络的完整参考代码如下:

首先,创建一个名为HttpUtils的工具类,用于封装HTTP请求的方法。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;public class HttpUtils {public static String sendHttpGetRequest(String url) throws IOException {URL obj = new URL(url);HttpURLConnection con = (HttpURLConnection) obj.openConnection();// 设置请求方法为GETcon.setRequestMethod("GET");// 添加请求头con.setRequestProperty("User-Agent", "Mozilla/5.0");int responseCode = con.getResponseCode();System.out.println("Response Code: " + responseCode);InputStream inputStream = null;BufferedReader reader = null;StringBuilder result = new StringBuilder();try {inputStream = con.getInputStream();reader = new BufferedReader(new InputStreamReader(inputStream));String line;while ((line = reader.readLine()) != null) {result.append(line);}} finally {if (reader != null) {reader.close();}if (inputStream != null) {inputStream.close();}con.disconnect();}return result.toString();}
}

在需要发送HTTP请求的地方,调用HttpUtils类中的sendHttpGetRequest方法。

import android.os.AsyncTask;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;public class MainActivity extends AppCompatActivity {private TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView = findViewById(R.id.textView);new HttpRequestTask().execute("https://api.example.com/data");}private class HttpRequestTask extends AsyncTask<String, Void, String> {@Overrideprotected String doInBackground(String... params) {String result = "";try {result = HttpUtils.sendHttpGetRequest(params[0]);} catch (IOException e) {e.printStackTrace();}return result;}@Overrideprotected void onPostExecute(String result) {super.onPostExecute(result);textView.setText(result);}}
}

在这个示例中,我们创建了一个名为HttpUtils的工具类,其中包含一个名为sendHttpGetRequest的方法,用于发送HTTP GET请求。然后,在MainActivity中,我们创建了一个名为HttpRequestTask的内部类,继承自AsyncTask,并在doInBackground方法中调用HttpUtils.sendHttpGetRequest方法。最后,在onPostExecute方法中,我们将获取到的数据显示在TextView中。

在Android中,访问网络需要声明权限。首先需要在AndroidManifest.xml文件中添加以下权限:

<uses-permission android:name="android.permission.INTERNET" />

2,使用Pull方式解析XML格式数据

在Android中,使用Pull方式解析HTTP URLConnection返回的XML格式数据的代码示例如下:

首先,创建一个名为HttpUtils的工具类,用于处理HTTP请求和响应:

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;public class HttpUtils {public static String getResponse(String requestUrl) throws Exception {URL url = new URL(requestUrl);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.setConnectTimeout(5000);connection.setReadTimeout(5000);int responseCode = connection.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) {InputStream inputStream = connection.getInputStream();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));StringBuilder stringBuilder = new StringBuilder();String line;while ((line = bufferedReader.readLine()) != null) {stringBuilder.append(line);}bufferedReader.close();return stringBuilder.toString();} else {throw new Exception("请求失败,响应码:" + responseCode);}}
}

然后,在需要解析XML数据的地方,调用HttpUtils.getResponse()方法获取XML字符串,并使用Android内置的XmlPullParser进行解析:

import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;import java.io.IOException;
import java.io.StringReader;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);try {String xmlString = HttpUtils.getResponse("http://example.com/data.xml");XmlPullParserFactory factory = XmlPullParserFactory.newInstance();factory.setNamespaceAware(true);XmlPullParser xpp = factory.newPullParser();xpp.setInput(new StringReader(xmlString));int eventType = xpp.getEventType();while (eventType != XmlPullParser.END_DOCUMENT) {if (eventType == XmlPullParser.START_TAG) {String tagName = xpp.getName();switch (tagName) {case "item":// 处理item标签的数据break;case "name":// 处理name标签的数据break;case "value":// 处理value标签的数据break;}}eventType = xpp.next();}} catch (IOException | XmlPullParserException e) {e.printStackTrace();}}
}

注意:请将http://example.com/data.xml替换为实际的XML数据地址。

3,使用OKHttp访问网络

在Android中,使用OkHttp访问网络的完整参考代码例子如下:

首先,在项目的build.gradle文件中添加OkHttp依赖:

dependencies {implementation 'com.squareup.okhttp3:okhttp:4.9.0'
}

然后,创建一个名为OkHttpUtil的工具类,用于封装OkHttp相关的操作:

import okhttp3.*;import java.io.IOException;public class OkHttpUtil {private static final OkHttpClient client = new OkHttpClient();public static String get(String url) throws IOException {Request request = new Request.Builder().url(url).build();try (Response response = client.newCall(request).execute()) {return response.body().string();}}
}

最后,在需要使用OkHttp的地方调用OkHttpUtil工具类的方法:

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;import java.io.IOException;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView textView = findViewById(R.id.textView);try {String result = OkHttpUtil.get("https://api.github.com/users/octocat");textView.setText(result);} catch (IOException e) {e.printStackTrace();}}
}

这个例子展示了如何使用OkHttp库发送GET请求并获取响应。你可以根据需要修改OkHttpUtil类中的方法和参数来实现其他HTTP方法(如POST、PUT、DELETE等)。

4,使用SAX方式解析xml格式数据

在Android中使用SAX解析XML格式数据,首先需要创建一个继承自DefaultHandler的类,然后重写其中的方法来处理XML元素和属性。接下来,使用SAXParserFactory创建一个SAXParser对象,并调用其parse`方法来解析XML数据。

以下是一个简单的示例:

创建一个继承自DefaultHandler的类,例如MyHandler:

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;public class MyHandler extends DefaultHandler {@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {// 在这里处理XML元素的开始标签System.out.println("开始标签:" + qName);}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {// 在这里处理XML元素的结束标签System.out.println("结束标签:" + qName);}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {// 在这里处理XML元素的文本内容System.out.println("文本内容:" + new String(ch, start, length));}
}

使用SAXParserFactory和SAXParser解析XML数据:

import android.os.AsyncTask;
import android.util.Log;import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;public class MainActivity extends AppCompatActivity {private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new FetchXmlTask().execute("https://api.github.com/users/octocat");}private class FetchXmlTask extends AsyncTask<String, Void, String> {@Overrideprotected String doInBackground(String... urls) {try {URL url = new URL(urls[0]);HttpURLConnection connection = (HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");connection.connect();if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {InputStream inputStream = connection.getInputStream();SAXParserFactory factory = SAXParserFactory.newInstance();SAXParser saxParser = factory.newSAXParser();MyHandler handler = new MyHandler();saxParser.parse(inputStream, handler);return null;} else {return null;}} catch (IOException | ParserConfigurationException | SAXException e) {e.printStackTrace();return null;}}}
}

这个示例中,我们创建了一个名为MyHandler的类来处理XML元素和属性,然后在MainActivity中使用FetchXmlTask异步任务来获取OKHttp返回的XML数据,并使用SAX解析器解析这些数据。

5,发送数据给网络服务器
在Android中,可以使用HttpURLConnection或者第三方库如OkHttp来发送数据给网络服务器。这里给出一个使用HttpURLConnection的简单示例:

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new Thread(new Runnable() {@Overridepublic void run() {try {String url = "https://api.example.com/data";URL obj = new URL(url);HttpURLConnection con = (HttpURLConnection) obj.openConnection();// 设置请求方法为POSTcon.setRequestMethod("POST");// 添加请求头con.setRequestProperty("User-Agent", "Mozilla/5.0");con.setRequestProperty("Content-Type", "application/json");// 发送POST请求必须设置如下两行con.setDoOutput(true);con.setDoInput(true);// 获取连接对象对应的输出流DataOutputStream wr = new DataOutputStream(con.getOutputStream());wr.writeBytes("{\"key\":\"value\"}");wr.flush();wr.close();int responseCode = con.getResponseCode();System.out.println("Response Code: " + responseCode);BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));String inputLine;StringBuffer response = new StringBuffer();while ((inputLine = in.readLine()) != null) {response.append(inputLine);}in.close();// 输出结果System.out.println(response.toString());} catch (Exception e) {e.printStackTrace();}}}).start();}
}

这个示例中,我们创建了一个新的线程来执行网络请求,以避免阻塞主线程。我们使用HttpURLConnection发起一个POST请求,并添加了一个请求头。然后,我们将要发送的数据写入输出流,并获取服务器的响应。最后,我们将响应内容输出到控制台。

注意:提交的数据都要以键值对的形式存在,数据与数据间用&符合隔开。比如wr.writeBytes(“username=admin&password=123456”);

5,使用Gson方式解析json格式的数据

在Android中使用Gson库解析OKHttp网络返回的数据,首先需要添加Gson库的依赖。在项目的build.gradle文件中添加以下依赖:

dependencies {implementation 'com.google.code.gson:gson:2.8.9'
}

然后,创建一个Java类来表示网络返回的数据结构。例如,假设网络返回的数据是一个包含用户信息的JSON对象:

{"name": "张三","age": 30
}

可以创建一个名为User的Java类:

public class User {private String name;private int age;// getter和setter方法
}

接下来,使用Gson库将网络返回的JSON字符串解析为User对象:

import com.google.gson.Gson;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 假设这是从OKHttp网络请求中获取到的JSON字符串String json = "{\"name\":\"张三\",\"age\":30}";// 创建Gson对象Gson gson = new Gson();// 使用Gson对象将JSON字符串解析为User对象User user = gson.fromJson(json, User.class);// 输出解析后的用户信息System.out.println("姓名:" + user.getName() + ",年龄:" + user.getAge());}
}

这样,就可以使用Gson库将OKHttp网络返回的数据解析为Java对象了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/221404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧运维:一体化管理软件解决方案

随着信息化时代的快速发展&#xff0c;各行各业对运维管理的要求越来越高。为了满足不断增长的需求&#xff0c;我们推出了一款全新的一体化监控运维软件。该软件采用综合运维系统&#xff0c;实现对云服务平台、大数据平台、智慧安防、业务软件、基础设施和安全防范设施的全方…

2024年邮件群发的优势

在当今数字化时代&#xff0c;随着社交媒体和移动应用的兴起&#xff0c;有些人可能会认为邮件营销已经过时了&#xff0c;不再是有效的营销方式。然而&#xff0c;事实并非如此。事实上&#xff0c;邮件营销仍然是一种强大而有效的工具&#xff0c;可以帮助企业建立品牌认知、…

【TC3xx】GETH

目录 一、RGMII 二、SMI接口 三、TC3xx MCAL 3.1 MCU 3.2 Port 3.3 DMA 3.4 中断配置 3.5 ETH 3.6 集成 一、RGMII TC3xx支持MII/RMII/RGMII三种以太网数据通信接口。其中RGMII经常用于MAC和MAC之间&#xff0c;或MAC与PHY之间的通信&#xff0c;RGMII的带宽可以是10M…

Soul 推出“SoulX”AI人工智能模型,已应用于旗下 App“苟蛋”AI聊天机器人

Soul社交平台最近发布了名为”SoulX“的AI人工智能模型&#xff0c;SoulX将作为Soul “AIGC社交”布局的重要基建&#xff0c;具备prompt驱动、条件可控生成、上下文理解、多模态理解等能力&#xff0c;垂直应用于平台上多元社交互动场景&#xff0c;如智能对话机器人、AI辅助聊…

为什么越来越多的人从事软件测试行业?

1.市场需求增加&#xff1a;随着数字化转型和互联网的普及&#xff0c;各行各业都需要高质量、稳定可靠的软件来支持其业务运作。因此&#xff0c;对软件测试人员的需求也随之增加。同时&#xff0c;新兴技术的发展&#xff0c;如物联网、大数据、区块链、人工智能等&#xff0…

图纸加密防泄密软件排名

随着科技的不断发展&#xff0c;图纸作为企业的核心资产&#xff0c;其安全性越来越受到重视。为了防止图纸泄露和被非法获取&#xff0c;许多企业开始采用图纸加密防泄密软件来保护自己的核心资产。 本文将介绍一些在市场上广受欢迎的图纸加密防泄密软件&#xff0c;并分析其优…

Spring 框架有哪些缺点?

目录 1、性能问题 2、配置复杂性 3、学习曲线 4、过度依赖Spring生态 5、过分依赖"魔法" 6、版本升级和兼容性问题 7、依赖注入的滥用 1、性能问题 缺点描述&#xff1a; Spring的依赖注入和AOP&#xff08;面向切面编程&#xff09;功能虽然提供了极大的灵活…

电话营销是如何影响企业的销售业绩的?

目前电话营销已经成为销售行业的一个重要分支。通过大量的拨打电话积累客户&#xff0c;效率比传统的陌拜高得多。 电话营销的概念和特点 电话营销是指企业通过电话这一渠道&#xff0c;向目标客户进行销售、市场推广、调查等活动的一种营销方式。具有以下特点&#xff1a; …

TSINGSEE青犀中央厨房视频智能监控监管解决方案

一、行业背景 预制菜是指经过洗、切、搭配、加工完成的菜品&#xff0c;采取冷冻或真空等一系列方式进行包装保存&#xff0c;消费者购买后只需通过简单烹调或直接开封即可食用&#xff0c;具有方便、高效、出品稳定的特点。据统计报告分析&#xff0c;从上游食材生产推算以及…

JVM虚拟机系统性学习-JVM相关工具jps、jstat、jinfo、jmap、jhat和jstack

JVM 相关工具 JDK 工具包 jps 查看 Java 进程 jps &#xff1a;列出Java程序进程ID和Main函数名称 jps -q &#xff1a;只输出进程ID jps -m &#xff1a;输出传递给Java进程&#xff08;主函数&#xff09;的参数 jps -l &#xff1a;输出主函数的完整路径 jps -v &#x…

LeetCode Hot100 148.排序链表

题目&#xff1a; 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 class Solution {public ListNode sortList(ListNode head) {return sortList(head, null);}private ListNode sortList(ListNode head, ListNode tail) {if (head null)retur…

深入解析MSSQL聚簇索引:加速查询的利器

在大数据时代&#xff0c;高效的数据库索引是保证系统性能的关键。而在MSSQL数据库中&#xff0c;聚簇索引是一项强大的技术&#xff0c;它能够极大地提升查询性能和数据访问效率。本文将深入探讨聚簇索引的原理、与其他索引的区别&#xff0c;以及适用的场景和关键技术点&…

【贪心】LeetCode-55. 跳跃游戏

55. 跳跃游戏。 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 …

回归预测 | MATLAB实现IBL-LSSVM【23年新算法】逻辑优化算法优化最小二乘支持向量机的数据回归预测 (多指标,多图)

回归预测 | MATLAB实现IBL-LSSVM【23年新算法】逻辑优化算法优化最小二乘支持向量机的数据回归预测 &#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现IBL-LSSVM【23年新算法】逻辑优化算法优化最小二乘支持向量机的数据回归预测 &#xff08;多指标…

计算机网络:运输层

0 本节主要内容 问题描述 解决思路 1 问题描述 1.1 知识回顾 利用如下拓扑对前面的知识进行回顾。 问题&#xff1a;源主机 H 1 \textrm{H}_1 H1​要和目的主机 H 2 \textrm{H}_2 H2​进行通信&#xff0c;源主机 H 1 \textrm{H}_1 H1​要构建数据包封装来自应用层的数据。…

【产品应用】一体化伺服电机在TO全自动封焊机中的应用

随着科技的飞速发展&#xff0c;自动化设备在各行各业中的应用越来越广泛。在电子制造领域&#xff0c;封焊机是关键设备之一&#xff0c;其性能直接影响产品的质量和产量。近年来&#xff0c;一体化伺服电机在TO全自动封焊机中的应用逐渐受到关注。本文将详细介绍一体化伺服电…

DCNv2安装适配pytorch各个版本

DCNv2安装适配pytorch各个版本 介绍解决方案使用Fork版本&#xff08;推荐&#xff09;☆☆☆☆☆DCNv2_latest项目&#xff08;不推荐&#xff09; 介绍 原始项目&#xff1a;https://github.com/CharlesShang/DCNv2 注意&#xff1a;原始项目只有低版本的pytorch安装 解决方…

我本地是正常的,线上就有问题?为啥?玄学?

笔者作为研发&#xff0c;细细数来已经搬了多年程序的砖了&#xff0c;也带了不少新人&#xff0c;发现好多新人都有如题的提问。这里珍重申明我并不是歧视新人哈&#xff0c;只是想根据老程序猿搬砖的经验&#xff0c;分享一下问题排查经验。或许对焦头烂额的你会有那么一点点…

变电站蓄电池在线监测系统(论文+源码)

1. 系统设计 本次课题为变电站蓄电池在线监测系统的设计&#xff0c;其系统架构如图3.1所示&#xff0c;包括了主控制器STC89C52单片机&#xff0c;液晶显示器LCD1602,模数转换器ADC0832&#xff0c;电流传感器ACS712&#xff0c;分压电阻&#xff0c;蜂鸣器以及温度传感器。在…

LeeCode前端算法基础100题(8)-买卖股票的最佳时机 III

一、问题详情: 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 示例 1: 输入:prices = [3,3,5,0,0,3,1,…