使用HttpURLConnection
在过去Android中发送HTTP请求的一般有两种方式:HttpURLConnection和HttpClient。由于HttpClient存在API数量过多,扩展困难等缺点,Android团队不建议我们使用这种方式。后HttpClient的功能被完全移除
下面介绍HttpURLConnection的用法
首先需要获取到HttpURLConnection的实例,一般只需要new出一个URL对象,并传入目标的网络地址,然后调用一下openConnection()方法即可,
URL url=new URL(“http://www.baidu.com”);
HttpURLConnetion connection=(HttpURLConnection) url.openConnection();
在得到HttpURLConnection实例后,我们可以设置一下HTTP请求所使用的方法,常用的有GET和POST,GET表示希望从服务器那里获取数据,而POST表示希望提交数据给服务器。写法:
connection.setRequestMethod(“GET”);
接下来可以进行一下自由定制了如设置连接超时,读取超时的毫秒数,以及服务器希望得到的一些消息头,这部分内容根据自己的实际情况进行编写,
如下:
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
之后再调用getInputStream()方法就可以返回的输入流了,剩下的任务就是对输入流进行读取。如下:
InputStream in=connection.getInputStream();
最后调用disconnect()方法将这个HTTP连接关闭掉。
connection.disconnect();
使用OkHttp
OkHttp是有Square公司开发的,不仅在接口封装上面做的简单易用,就连在底层实现上也是自成一派,比起原生的HttpURLConnection,可以说是有过之而无不及,现在成了网络开发者们选的网络通信库。
首先我们使用OkHttp需要添加OkHttp库依赖。
编辑app/build.gradle文件,在dependencies闭包中添加内容:
dependencies{
compile ‘’
}
添加上述依赖会自动下载两个库,一个OkHttp库,一个是Okio库,后者是前者的通信基础
OkHttp具体用法
创建一个OkHttpClient的实例
OkHttpClient client=new OkClient();
若想要发起一条Http请求,就需要创建一个Request对象:
Request request=new Request.Builder().build();
以上只是创建了一个空的Request对象,并没什么实际作用,我们可以在最终的build()方法之前连缀很多其他方法来丰富这个Request对象。如可以提供url()方法来设置目标的网络地址
Request request=new Request.Builder()
.url(“http://www/baidu.com”)
.build();
之后调用OkHttpClient的newCall()方法创建一个Call对象,并调用它的execute()方法来发送请求并获取服务器返回的数据,写法
Response response=client.newCall(request).execute();
其中Response对象就是服务器返回的数据了,我们可以使用如下写法得到返回的具体内容:
String responseData=response.body().String();
如果是发起一条POST请求会比GET请求稍微复杂一点,我们需要限购件出一个Request Body对象来存放待提交的参数
RequestBody requestBody=new FormBody.Builder()
.add(“username”,“admin”)
.add(“password”,“123456”)
.build();
然后在Request.Builder中调用一个post()方法,并将RequestBody对象传入:
Request request=new Request.Builder()
.url(“http://www.baidu.com”)
.post(requestBody)
.build();
接下来就和GET请求一样了,调用execute()方法来发送请求并获取服务器返回的数据即可
解析XML格式数据
通常情况下,每个需访问网络的应用程序都会有一个自己的服务器,我们可以向服务器里提交数据,也可以从服务器里获取数据,这时候会出现一个问题,数据到底要以什么样的格式在网络上传输呢?我们一般会在网上传输一些格式化后的数据这种数据会有一定的结构规格和语义,另一方四月底啊数据消息之后就可以按照相同的结构规格进行解析,从而取出想要的那部分内容。
最常用的有两种:XML和JSON
创建一个web服务器,这个服务器提供一段xml文本,然后我们在程序里去访问这个服务器,再对得到的xml文本进行解析,
搭建web服务器有很多服务器类型可供选择,这里我们常用的是Apache服务器。
先安装一下Apache服务器 要和apache -tomcat区分开 。
解析XML格式的数据我们常用的有两种,Pull解析和SAX解析
Pull解析方式:
这里是要找指定访问的服务器地址是电脑本机的IP地址
cmd命令下输入:ipconfig IPV4地址就是我们要找的地址()首先我们要获取一个XmlPullParserFactory的实例,借助这个实例得到XmlPullParser对象,然后调用XmlPullParser的setInp()方法将服务器返回的XML数据设置进去就可以开始解析了.解析的是通过getEventType()可以得到当前的解析事件,然后在一个while循环中不断的进行解析,若当前解析事件不等于XmlPullParser.END_DOCUMENT,说明解析工程还没有完,调用nextText()方法来获取节点内具体的内容。每当解析完一个app节点后九江获取到的内容打印出来。
SAX解析方式
SAX解析也是一种特别常用的XML解析方式,它比Pull解析方式复杂一些,但语义方面回更加清楚。
首先我们新建一个类继承自DefaultHandler,重写父类的5个方法。
startDocument()方法会在开始解析某个节点的时候调用,characters()方法会在获取节点中内容的时候调用,endElement()方法会在完全解析某个节点的时候调用,endDocument()方法会在完成整个XML解析的时候调用。其中,startElement()、characters()和endElement()这3个方法是有参数的,从XML中心解析出来的数据就会以参数的形式传入到这些方法中。注意,在获取节点中的内容是时,characters()方法可能会被多次调用,一些换行符也被当作内容解析出来,我们需要针对这种情况在代码中做好控制。
解析JSON格式数据
使用JsonObject,是官方提供的,也可以使用谷歌的开源库GSON,另外,一些第三方的开源库如Jackson。FastJSON
使用GSON,谷歌提供的GSON开源库可以让解析JSON数据的工作更加简单。
使用GSON首先添加库依赖,GSON可以将一段JSON格式的字符串自动映射成一个对象,从而不需要我们手动编写代码进行解析。
如JSON格式数据如下:
{“name”:“Tom”,“age”:20}
我们可以定义一个person类,并加入name和age这两个字段,然后只需要简的调用以下代码就可以将JSON数据自动解析成一个Person对象了:
Gson gson=new Gson();
Person person=gson.fromJson(jsonData,Person.class);
若要解析一段 JSON数组会稍微麻烦一些,需要借助TypeToken将期望解析成的数组类型传入到fromJson()方法在
List people=gson.fromJson(jsonData,new TypeToken<List>(){}.getType());