网络通信与xml转换知识点Word文件下载.docx
《网络通信与xml转换知识点Word文件下载.docx》由会员分享,可在线阅读,更多相关《网络通信与xml转换知识点Word文件下载.docx(38页珍藏版)》请在冰豆网上搜索。
另外,Android已经成功地集成了HttpClient,这意味着开发人员可以直接在Android应用中使用Httpclient来访问提交请求、接收响应。
比如一个Android应用需要向指定页面发送请求,但该页面并不是一个简单的页面,只有当用户已经登录,而且登录用户的用户名有效时才可访问该页面。
如果使用HttpURLConnection来访问这个被保护的页面,那么需要处理的细节就太复杂了。
其实访问Web应用中被保护的页面,使用浏览器则十分简单,用户通过系统提供的登录页面登录系统,浏览器会负责维护与服务器之间的Sesion,如果用户登录的用户名、密码符合要求,就可以访问被保护资源了。
在Android应用程序中,则可使用HttpClient来登录系统,只要应用程序使用同一个HttpClient发送请求,HttpClient会自动维护与服务器之间的Session状态,也就是说程序第一次使用HttpClient登录系统后,接下来使用HttpClient即可访问被保护页而了。
扩展知识:
了解HttpCore
1.HTTPClient
Org.apache.http.client工具包
项目1
/**
*向远程的url服务器进行post一个数据包
*
*@paramurl
*需要进行post的服务器
*@paramparas
*数据包中的参数
*@return
*@throwsException
*/
publicstaticStringpostData(Stringurl,Stringdata,
StringuploadEncoding,StringresponseEncoding)throwsException{
RequestConfigconfig=RequestConfig.custom().build();
HttpClientclient=HttpClients.custom()
.setDefaultRequestConfig(config).build();
HttpClientContextcontext=HttpClientContext.create();
HttpPostpost=newHttpPost(url);
if(StringUtils.isNotBlank(data)){
post.setEntity(newStringEntity(data,uploadEncoding));
}
CloseableHttpResponseresponse=(CloseableHttpResponse)client
.execute(post,context);
returnEntityUtils.toString(response.getEntity(),responseEncoding);
}
2.URLConnection
Java自带
publicstaticStringgetFromSpecialUrl(Stringstr,Stringparam)throwsException{
log.info("
requestcorezy++++++++++++++++++++++++++++++++++++++++++"
);
URLurl=null;
URLConnectionconn=null;
BufferedReaderbufferedReader=null;
InputStreaminputStream=null;
StringBufferresponseXml=null;
PrintWriteroutput=null;
Stringresult;
try{
url=newURL(str);
log.info("
url"
+url);
conn=(URLConnection)url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setConnectTimeout(1000);
output=newPrintWriter(conn.getOutputStream());
output.print(param.toString());
output.close();
responseXml=newStringBuffer();
inputStream=conn.getInputStream();
bufferedReader=newBufferedReader(newInputStreamReader(
inputStream,"
GBK"
));
Strings;
while((s=bufferedReader.readLine())!
=null){
responseXml.append(s);
}
bufferedReader.close();
}catch(IOExceptione){
e.printStackTrace();
System.out.println("
系统处理异常!
"
result=responseXml.toString();
System.out.println("
接收到的报文:
+result);
returnresult;
3.HTTPClient和URLConnection的区别
对比项目
URLConnection
HTTPClient
提交方式(Methods)
HEAD,GET,POST,PUT,DELETE,TRACE,OPTIONS
HEAD,GET,POST,PUT,DELETE,TRACE,OPTIONS,WEBDav,IPP,甚至各种自定义提交方式
响应(ResponseCodes)
只能获取http状态码小于400的状态码,响应头信息(headers),响应内容.对于响应状态码为4xx或者5xx获取response的任何信息都只会抛出IOException
任何时候都可以获取响应的任何信息:
响应状态码,响应头信息,响应内容信息等等。
代理和SOCKS
支持,SOCKS仅支持4
支持,SOCKS支持4和5
认证(Authorization)
支持Basic、早期的DigestJDK1.2+(不支持现在的Digestauthentication),甚至不能处理apache返回的Digest信息
支持Basic、DigestAuthentication、自定义的其他认证方案
Cookies
不支持
支持
请求输出流
(Truerequestoutputstreams)
请求发送之前,所有的数据都被缓存起来
通过socket直接输出HttpOutputStream
响应输入流
(Trueresponseinputstreams)
JDK1.2-支持,1.3+不支持chunkedencoding(不支持大多数推送服务器的响应)
长连接
(PersistentConnections)
JDK1.2-HTTP/1.0Keep-Alive,JDK1.3+
HTTP/1.1Persistent
支持HTTP/1.0Keep-Alive和HTTP/1.1Persistent
PipeliningofRequests
设置超时
处理HTTP之外的协议
支持如:
ftp,gopher,mailto,文件系统
开源
否
是
二,XML工具包xStream
XmlUtils
xStream可以轻易的将Java对象和xml文档相互转换,而且可以修改某个特定的属性和节点名称,而且也支持json的转换;
它们都完美支持JSON,但是对xml的支持还不是很好。
一定程度上限制了对Java对象的描述,不能让xml完全体现到对Java对象的描述。
这里将会介绍xStream对JSON、XML的完美支持。
xStream不仅对XML的转换非常友好,而且提供annotation注解,可以在JavaBean中完成对xml节点、属性的描述。
以及对JSON也支持,只需要提供相关的JSONDriver就可以完成转换。
1、下载jar包、及官方资源
xStream的jar下载地址:
https:
//nexus.codehaus.org/content/repositories/releases/com/thoughtworks/xstream/xstream-distribution/1.3.1/xstream-distribution-1.3.1-bin.zip
添加xstream-1.3.1.jar文件到工程中,就可以开始下面的工作;
需要的jar如下:
2、测试用例代码
publicclassXStreamTest{
privateXStreamxstream=null;
privateObjectOutputStreamout=null;
privateObjectInputStreamin=null;
privateStudentbean=null;
@Before
publicvoidinit(){
xstream=newXStream();
//xstream=newXStream(newDomDriver());
//需要xpp3jar
bean=newStudent();
bean.setAddress("
china"
bean.setEmail("
jack@"
bean.setId
(1);
bean.setName("
jack"
Birthdayday=newBirthday();
day.setBirthday("
2010-11-22"
bean.setBirthday(day);
@After
publicvoiddestory(){
xstream=null;
bean=null;
if(out!
out.flush();
out.close();
if(in!
in.close();
System.gc();
通过XStream对象的toXML方法就可以完成Java对象到XML的转换,toXML方法还有2个相同签名的方法,需要传递一个流。
然后通过流来完成xml信息的输出。
3、需要的JavaBean
packagecom.hoo.entity;
publicclassStudent{
privateintid;
privateStringname;
privateStringemail;
privateStringaddress;
privateBirthdaybirthday;
//getter、setter
publicStringtoString(){
returnthis.name+"
#"
+this.id+"
+this.address+"
+this.birthday+"
+this.email;
}
1、Java转换成XML
1.1JavaBean转换XM
@Test
publicvoidwriteBean2XML(){
System.out.println("
------------Bean->
XML------------"
System.out.println(xstream.toXML(bean));
重命名后的XML"
//类重命名
//xstream.alias("
account"
Student.class);
生日"
Birthday.class);
//xstream.aliasField("
Student.class,"
birthday"
Birthday.class,"
//System.out.println(xstream.toXML(bean));
//属性重命名
xstream.aliasField("
邮件"
email"
//包重命名
xstream.aliasPackage("
hoo"
"
com.hoo.entity"
看结果中的第一份xml内容,是没有经过然后修改或重命名的文档,按照原样输出。
文档中的第二份文档的package经过重命名,email属性也经过重命名以及类名也可以进行重命名的。
运行后结果如下:
XML------------
<
com.hoo.entity.Student>
<
id>
1<
/id>
name>
jack<
/name>
email>
jack@<
/email>
address>
china<
/address>
birthday>
2010-11-22<
/birthday>
/com.hoo.entity.Student>
重命名后的XML
hoo.Student>
邮件>
/邮件>
/hoo.Student>
1.2将List集合转换成xml文档
publicvoidwriteList2XML(){
try{
//修改元素名称
xstream.alias("
beans"
ListBean.class);
student"
----------List-->
XML----------"
ListBeanlistBean=newListBean();
listBean.setName("
thisisaListCollection"
List<
Object>
list=newArrayList<
();
list.add(bean);
//引用bean
//list.add(listBean);
//引用listBean,父元素
tom@"
bean.setId
(2);
tom"
Birthdayday=newBirthday("
bean.setBirthday(day);
listBean.setList(list);
//将ListBean中的集合设置空元素,即不显示集合元素标签
//xstream.addImplicitCollection(ListBean.class,"
list"
//设置reference模型
//xstream.setMode(XStream.NO_REFERENCES);
//不引用
xstream.setMode(XStream.ID_REFERENCES);
//id引用
//xstream.setMode(XStream.XPATH_ABSOLUTE_REFERENCES);
//绝对路径引用
//将name设置为父类(Student)的元素的属性
xstream.useAttributeFor(Student.class,"
name"
xstream.useAttributeFor(Birthday.class,"
//修改属性的name
xstream.aliasAttribute("
姓名"
System.out.println(xstream.toXML(listBean));
}catch(Exceptione){
e.printStackTrace();
上面的代码运行后,结果如下:
XML----------
beansid="
1"
>
thisisaListCollection<
listid="
2"
studentid="
3"
姓名="
birthdayid="
4"
生日="
/>
/student>
studentreference="
5"
2<
tom@<
6"
/list>
/beans>
如果不加xstream.addImplicitCollection(ListBean.class,"
这个设置的话,会出现一个List节点包裹着Student节点元素。
添加addImplicitCollection可以忽略这个list节点元素。
那么上面的list节点就不存在,只会在beans元素中出现name、student这2个xml元素标签;
setMode是设置相同的对象的引用方式,如果设置XStream.NO_REFERENCES就是不引用,会输