安卓访问网络服务器数据之http与数据解析

本文介绍了使用HttpURLConnection进行GET和POST请求的方法,以及使用OkHttp替代。同时详细讲解了XML的PULL解析方式(SAX)和JSON解析(Gson)在Android应用中的实现。
摘要由CSDN通过智能技术生成
  1. HttpURLConnection

    URL url=new URL("<http://www.baidu.com>");
    HttpURLConnection connection=(HttpURLConnection) url.openConnection();
    //从服务器获取数据
    connection.setRequestMethod("GET");
    InputStream in=connection.getInputStream();
    connection.disconnect();
    //提交数据给服务器
    connection.setRequestMethod("POST");
    DataOutputStream out new DataOutputStream(connection.getOutputStream());
    out.writeBytes("username=admin&password=123456");
    
  2. OkHttp

    OkHttpClient client=new OkHttpClient();
    //request请求
    Request request=new Request.Builder().url("<http://www.baidu.com>").build();
    Response response=client.newCall(request).execute();//response对象中已经有返回的数据了
    String responseData=response.body().string();
    //post请求
    RequestBody requestBody=new FormBody.Builder().add("username","admin").add("password","123456").builder();
    Request request=new Request.Builder().url("<http://www.baidu.com>").post(requestBody).build();
    Response response=client.newCall(request).execute();
    
  3. XML格式解析

    1. PULL解析方式

      1. 收到responseData之后,调用parseXMLWithPull方法
      private void parseXMLWithPull(String xmlData) {
      		try {
      				XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
      				XmlPullParser xmlPullParser=factory.newPullParser();
      				xmlPullParser.setInput(new StringReader(xmlData));
      				int eventType=xmlPullParser.getEventType();
      				String id="";
      				String name="";
      				String version="";
      				while (eventType!=XmlPullParser.END_DOCUMENT)
      				{
      						String nodeName=xmlPullParser.getName();
      						switch (eventType) {
      								case XmlPullParser.START_TAG: {
      										if ("id".equals(nodeName)) {
      												id=xmlPullParser.nextText();
      										} else if ("name".equals(nodeName)) {
      												name=xmlPullParser.nextText();
      										} else if ("version".equals(nodeName)) {
      												version=xmlPullParser.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=xmlPullParser.next();
      						}
      			}
      }
      
      
    2. SAX解析:用法稍微复杂一点,但是语义更加清晰

      public class ContentHandler 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 startElements(String uri,String localName,String qName,Attributes attribute) 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,Sring qName) throws SAXException {
      				if ("app".equals(localName)) {
      						Log.d("ContentHandler","id is"+id.toString().trim());
      						Log.d("ContentHandler","name is"+name.toString().trim());
      						Log.d("ContentHandler","version is"+version.toString().trim());
      						id.setLength(0);
      						name.setLength(0);
      						version.setLength(0);
      				} 
      		}
      		@override
      		public void endDocument() throws SAXException {
      				super.endDocument();
      		}
      }
      
  4. JSON格式的数据

    1. JSONObject

      private void parseJSONWithiJSONObject(String jsonData) {
      		try {
      				JSONArray jsonArray=new JSONArray(jsonData);
      				for(int i=0;i<jsonArray.length();i++) {
      						JSONObject jsonObject=jsonArray.getJSONObject(i);
      						String id=jsonObject.getString("id");
      						String name=jsonObject.getString("name");
      						String version=jsonObject.getString("version");
      						Log.d("MainActivity","id is"+id);
      						Log.d("MainActivity","name is"+name);
      						Log.d("MainActivity","version is"+version);
      				}
      		catch (Exception e) {
      				e.printStackTrace();
      		}
      }
      
    2. GSON

      //GSON没有被添加到Android官方的API中,需要在项目中添加GSON库的依赖
      private void parseJSONWithGSON(String jsonData) {
      		Gson gson=new Gson();
      		List<App> appList=gson.fromJson(jsonData,new TypeToken<List<app>>(){}.getType());
      		for (App app:appList) {
      				Log.d("MainActivity","id is"+app.getId());
      				Log.d("MainActivity","name is"+app.getName());
      		}
      }
      

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IP_FF02

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值