




免费预览已结束,剩余4页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
使用XStream解析XML(使用HttpClient 4发送请求)文章分类:Java编程 本文意在简单说明XStream解析XML,配合HttpClient 4发送请求,请求淘宝的开放API,那么我们在电子商务模式的系统中就可以使用一些淘宝API来为系统增加一个与众不同的模块。 首先来看淘宝API,这是本应用的重要部分,淘宝API的手册可以在线查看:下面就来说说简单的流程。我们通过URL发出请求,并收到返回的结果(XML或JSON)。请求中包含了一些必须的参数,这个就是文档中说明的。这里我们使用淘宝的商品API,获取一些商品的信息。在这之前需要在开放平台注册,获取你自己的APP_KEY和APP_SECRET,很简单。 获取到必要信息后,我们来看一下URL请求,这个需要符合TAOBAO的要求,才能请求到数据,其中有一段信息是加密的,就是签名字段,这个字段的计算比较复杂,网站提供的方法好像已经不能用了,那么我根据TAOBAO提供的SDK源码自行提取有用部分来编写了一个简单的算法。首先我们来看一下测试应用的结构: 使用Maven对应用进行管理,因为只是简单的应用程序,所以配置很简单,引入的第三方依赖也不多,我们来看看都需要些什么: 加入了这些依赖之后,我们就可以进行开发了。看了之前的代码结构,我们先从请求TAOBAO的数据开始说。就是生成请求签名的类SinguratureGenerator.java来看: Java代码 1. packagetaobao.util; 2. importjava.security.MessageDigest; 3. importjava.util.Set; 4. importjava.util.TreeMap; 5. importjava.util.Map.Entry; 6. mons.lang.StringUtils; 7. 8. /* 9. *生成淘宝API中的签名密码 10. * 11. *authorSarin 12. * 13. */14. publicclassSignatureGenerator 15. /* 16. *获取MD5加密结果 17. * 18. *paramparams 19. *参数集合 20. *paramsecret 21. *申请得到的APP_SECRET 22. *return 23. */24. publicstaticStringgetMD5Signature(TreeMapparams, 25. Stringsecret) 26. /存储签名的StringBuffer 27. StringBuildersign=newStringBuilder(); 28. /获取参数的项集合 29. SetEntryparamSet=params.entrySet(); 30. /组合要编码的串 31. StringBuilderquery=newStringBuilder(secret); 32. /遍历参数集合,获取参数值,形式key+value 33. for(Entryparam:paramSet) 34. if(StringUtils.isNotEmpty(param.getKey() 35. &StringUtils.isNotEmpty(param.getValue() 36. query.append(param.getKey().append(param.getValue(); 37. 38. 39. try 40. /使用MD5加密 41. MessageDigestmd5=MessageDigest.getInstance(MD5); 42. bytebytes=md5.digest(query.toString().getBytes(UTF-8); 43. /把二进制转化为大写的十六进制 44. for(inti=0;ibytes.length;i+) 45. Stringhex=Integer.toHexString(bytesi&0xFF); 46. if(hex.length()=1) 47. sign.append(0); 48. 49. sign.append(hex.toUpperCase(); 50. 51. catch(Exceptione) 52. thrownewjava.lang.RuntimeException(SignatureGenerateError!); 53. 54. returnsign.toString(); 55. 56. package taobao.util;import java.security.MessageDigest;import java.util.Set;import java.util.TreeMap;import java.util.Map.Entry;import mons.lang.StringUtils;/* * 生成淘宝API中的签名密码 * * author Sarin * */public class SignatureGenerator /* * 获取MD5加密结果 * * param params * 参数集合 * param secret * 申请得到的APP_SECRET * return */public static String getMD5Signature(TreeMap params,String secret) / 存储签名的StringBufferStringBuilder sign = new StringBuilder();/ 获取参数的项集合SetEntry paramSet = params.entrySet();/ 组合要编码的串StringBuilder query = new StringBuilder(secret);/ 遍历参数集合,获取参数值,形式key+valuefor (Entry param : paramSet) if (StringUtils.isNotEmpty(param.getKey()& StringUtils.isNotEmpty(param.getValue() query.append(param.getKey().append(param.getValue();try / 使用MD5加密MessageDigest md5 = MessageDigest.getInstance(MD5);byte bytes = md5.digest(query.toString().getBytes(UTF-8);/ 把二进制转化为大写的十六进制for (int i = 0; i bytes.length; i+) String hex = Integer.toHexString(bytesi & 0xFF);if (hex.length() = 1) sign.append(0);sign.append(hex.toUpperCase(); catch (Exception e) throw new java.lang.RuntimeException(Signature Generate Error!);return sign.toString(); 我们使用的是MD5的加密算法,需要传入一个TreeMap类型的参数集合对象,还有就是申请到的APP_SECRET字符串。使用TreeMap主要是利用其按照参数名的字典顺序排序特性,这也是TAOBAO的API要求的,那么算法注释很清楚了,这也是对它的SDK的简化,只保留必要内容。下面就是请求TAOBAO-API的类了,里面拼凑了请求参数并获得返回的结果: Java代码 1. packagetaobao; 2. importjava.io.IOException; 3. importjava.text.DateFormat; 4. importjava.text.SimpleDateFormat; 5. importjava.util.ArrayList; 6. importjava.util.List; 7. importjava.util.TreeMap; 8. importorg.apache.http.HttpResponse; 9. importorg.apache.http.HttpStatus; 10. importorg.apache.http.NameValuePair; 11. importorg.apache.http.client.HttpClient; 12. importorg.apache.http.client.entity.UrlEncodedFormEntity; 13. importorg.apache.http.client.methods.HttpPost; 14. importorg.apache.http.impl.client.DefaultHttpClient; 15. importorg.apache.http.message.BasicNameValuePair; 16. importorg.apache.http.util.EntityUtils; 17. importtaobao.util.SignatureGenerator; 18. /* 19. *获取淘宝API返回的结果 20. * 21. *authorSarin 22. * 23. */24. publicclassGetResult 25. /需要的常量参数 26. privatestaticfinalStringURL=/router/rest; 27. privatestaticfinalStringAPP_KEY=请填写你申请的; 28. privatestaticfinalStringAPP_SECRET=请填写你申请的; 29. privatestaticfinalStringFORMAT=xml; 30. privatestaticfinalStringMETHOD=taobao.item.get; 31. privatestaticfinalStringVERSION=2.0; 32. privatestaticDateFormatdf=newSimpleDateFormat(yyyy-MM-ddHH:mm:ss); 33. /* 34. *获取结果的方法 35. * 36. *paramfields 37. *需要请求的商品字段 38. *paramnum_iid 39. *商品ID,淘宝网URL中获得 40. *return 41. */42. publicstaticStringgetResult(Stringfields,Stringnum_iid) 43. Stringcontent=null; 44. HttpClientclient=newDefaultHttpClient(); 45. HttpPostpost=newHttpPost(URL); 46. Stringtimestamp=getFullTime(); 47. Listparams=newArrayList(); 48. params.add(newBasicNameValuePair(app_key,APP_KEY); 49. params.add(newBasicNameValuePair(format,FORMAT); 50. params.add(newBasicNameValuePair(method,METHOD); 51. params.add(newBasicNameValuePair(num_iid,num_iid); 52. params.add(newBasicNameValuePair(fields,fields); 53. params.add(newBasicNameValuePair(timestamp,timestamp); 54. params.add(newBasicNameValuePair(partner_id,911); 55. params.add(newBasicNameValuePair(v,VERSION); 56. params.add(newBasicNameValuePair(sign,SignatureGenerator 57. .getMD5Signature(getParams(timestamp,fields,num_iid), 58. APP_SECRET); 59. try 60. post.setEntity(newUrlEncodedFormEntity(params,UTF-8); 61. HttpResponseresponse=client.execute(post); 62. if(response.getStatusLine().getStatusCode()=HttpStatus.SC_NOT_IMPLEMENTED) 63. System.err 64. .println(ThePostMethodisnotimplementedbythisURI); 65. else 66. content=EntityUtils.toString(response.getEntity(); 67. 68. catch(IOExceptione) 69. System.err.println(e); 70. finally 71. client.getConnectionManager().shutdown(); 72. 73. returncontent; 74. 75. /* 76. *拼装参数 77. * 78. *paramtimestamp 79. *当前时间戳 80. *paramfields 81. *需要请求的商品字段 82. *paramnum_iid 83. *商品ID,淘宝网URL中获得 84. *return 85. */86. publicstaticTreeMapgetParams(Stringtimestamp, 87. Stringfields,Stringnum_iid) 88. TreeMaptreeMap=newTreeMap(); 89. treeMap.put(timestamp,timestamp); 90. treeMap.put(v,VERSION); 91. treeMap.put(app_key,APP_KEY); 92. treeMap.put(method,METHOD); 93. treeMap.put(partner_id,911); 94. treeMap.put(format,FORMAT); 95. treeMap.put(fields,fields); 96. treeMap.put(num_iid,num_iid); 97. returntreeMap; 98. 99. /* 100. *获取格式化好的时间 101. * 102. *return 103. */104. publicstaticStringgetFullTime() 105. returndf.format(newjava.util.Date(); 106. 107. package taobao;import java.io.IOException;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.List;import java.util.TreeMap;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.NameValuePair;import org.apache.http.client.HttpClient;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;import taobao.util.SignatureGenerator;/* * 获取淘宝API返回的结果 * * author Sarin * */public class GetResult / 需要的常量参数private static final String URL = /router/rest;private static final String APP_KEY = 请填写你申请的;private static final String APP_SECRET = 请填写你申请的;private static final String FORMAT = xml;private static final String METHOD = taobao.item.get;private static final String VERSION = 2.0;private static DateFormat df = new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);/* * 获取结果的方法 * * param fields * 需要请求的商品字段 * param num_iid * 商品ID,淘宝网URL中获得 * return */public static String getResult(String fields, String num_iid) String content = null;HttpClient client = new DefaultHttpClient();HttpPost post = new HttpPost(URL);String timestamp = getFullTime();List params = new ArrayList();params.add(new BasicNameValuePair(app_key, APP_KEY);params.add(new BasicNameValuePair(format, FORMAT);params.add(new BasicNameValuePair(method, METHOD);params.add(new BasicNameValuePair(num_iid, num_iid);params.add(new BasicNameValuePair(fields, fields);params.add(new BasicNameValuePair(timestamp, timestamp);params.add(new BasicNameValuePair(partner_id, 911);params.add(new BasicNameValuePair(v, VERSION);params.add(new BasicNameValuePair(sign, SignatureGenerator.getMD5Signature(getParams(timestamp, fields, num_iid),APP_SECRET);try post.setEntity(new UrlEncodedFormEntity(params, UTF-8);HttpResponse response = client.execute(post);if (response.getStatusLine().getStatusCode() = HttpStatus.SC_NOT_IMPLEMENTED) System.err.println(The Post Method is not implemented by this URI); else content = EntityUtils.toString(response.getEntity(); catch (IOException e) System.err.println(e); finally client.getConnectionManager().shutdown();return content;/* * 拼装参数 * * param timestamp * 当前时间戳 * param fields * 需要请求的商品字段 * param num_iid * 商品ID,淘宝网URL中获得 * return */public static TreeMap getParams(String timestamp,String fields, String num_iid) TreeMap treeMap = new TreeMap();treeMap.put(timestamp, timestamp);treeMap.put(v, VERSION);treeMap.put(app_key, APP_KEY);treeMap.put(method, METHOD);treeMap.put(partner_id, 911);treeMap.put(format, FORMAT);treeMap.put(fields, fields);treeMap.put(num_iid, num_iid);return treeMap;/* * 获取格式化好的时间 * * return */public static String getFullTime() return df.format(new java.util.Date(); 至此我们已经可以获得返回的XML数据,其中封装了商品信息,剩下的就是解析商品信息了,TAOBAO对商品信息定义了数据结构,我们按照这个结构封装对象,之后结合XStream来解析XML就获得了我们想要的数据了,那么先看商品数据结构,这里仅获取几个简单的供示例演示使用: Java代码 1. packagetaobao.bean; 2. publicclassResponse 3. privateItemitem; 4. publicItemgetItem() 5. returnitem; 6. 7. publicvoidsetItem(Itemitem) 8. this.item=item; 9. 10. package taobao.bean;public class Response private Item item;public Item getItem() return item;public void setItem(Item item) this.item = item; 这里封装了整体的响应结果,item是商品的数据结构,如下: Java代码 1. packagetaobao.bean; 2. publicclassItem 3. privateStringnick; 4. privateStringprice; 5. privateLocationlocation; 6. publicStringgetNick() 7. returnnick; 8. 9. publicvoidsetNick(Stringnick) 10. this.nick=nick; 11. 12. publicStringgetPrice() 13. returnprice; 14. 15. publicvoidsetPrice(Stringprice) 16. this.price=price; 17. 18. publicLocationgetLocation() 19. returnlocation; 20. 21. publicvoidsetLocation(Locationlocation) 22. this.location=location; 23. 24. package taobao.bean;public class Item private String nick;private String price;private Location location;public String getNick() return nick;public void setNick(String nick) this.nick = nick;public String getPrice() return price;public void setPrice(String price) this.price = price;public Location getLocation() return location;public void setLocation(Location location) this.location = location; 这里我们只要三个信息:卖家名称,商品价格,商品所在地,而所在地又是一个封装的数据结果对象,简单示例如下: Java代码 1. packagetaobao.bean; 2. publicclassLocation 3. privateStringstate; 4. privateStringcity; 5. publicStringgetState() 6. returnstate; 7. 8. publicvoidsetState(Stringstate) 9. this.state=state; 10. 11. publicStringgetCity() 12. returncity; 13. 14. publicvoidsetCity(Stringcity) 15. this.city=city; 16. 17. package taobao.bean;public class Location private String state;private String city;public String getState() return state;public void setState(String state) this.state = state;public String getCity() return city;public void setCity(String city) this.city = city; 获取省份和城市,这些数据结构的完整信息就要参考API文档了,这里仅仅是示例。下面就可以运行测试类了: Java代码 1. packagetaobao; 2. importtaobao.bean.Item; 3. importtaobao.bean.Location; 4. importtaobao.bean.Response; 5. importcom.thoughtworks.xstream.XStream; 6. importcom.thoughtworks.xstream.io.xml.DomDriver; 7. /* 8. *获取商品信息测试类 9. * 10. *authorSarin 11. * 12. */13. publicclassTaobaoXMLResult 14. publicstaticvoidmain(Stringargs)throwsException 15. /获取的商品ID和需要的字段 16. StringresultXML=GetResult.getResult(price,location,nick, 17. 74222099XX); 18. /XStream解析XML 19. XStreamxstream=newXStream(newDomDriver(); 20. xstream.alias(item_get_response,Response.class); 21. xstream.alias(item,Item.class); 22. xstream.alias(location,Location.class); 23. System.out.prin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 儿童美术油条课件
- 班组岗前安全培训
- 文明出行课件大班
- OA系统行政培训
- 圣诞蛋糕绘画课件
- 立体动画考试题及答案
- 广东公共关系学自考试题及答案
- 课件显示受保护视图
- 矿山车辆考试题及答案
- 口腔医考试题及答案
- 企业法律法规培训课件
- 2025-2030彩妆产业行业市场现状供需分析及投资评估规划分析研究报告
- 快递客户服务培训
- 馒头店管理制度
- 企业如何通过品牌战略实现增长和扩展
- 中药敷贴课件
- 动物无害化处理场建设项目可行性研究报告建议书
- 2025-2030年中国中高端猪肉市场发展现状及营销策略分析报告
- 全国林业碳汇计量监测技术指南(试行)
- DBJ33T 1289-2022 住宅厨房混合排气道系统应用技术规程
- 低温杜瓦瓶安全操作规程(4篇)
评论
0/150
提交评论