几点说明

1这个豆瓣的api

https://api.douban.com/v2/book/isbn/:9787549208869

可以以json的形式返回书籍的所有信息

2最开始的时候是我自己写的用代码模拟http请求(参考的是http://www.jb51.net/article/47070.htm)

但不知道为何会有乱码问题 有乱码不怕 怕的就是并不是所有的中文都是乱码 例如在返回出版社信息的时候 长江出版社 这几个字 长江出版可以显示 但是那个社就是两个问号 头疼了好长时间

3 写这个的时候 还碰到一个问题 就是关于字符替换 replace 与replaceAll 后者使用的是正则表达式 而且把\变成/ 着实让我头疼了一下

最后的效果

  1. import org.apache.commons.httpclient.HttpClient;
  2. import org.apache.commons.httpclient.HttpMethod;
  3. import org.apache.commons.httpclient.HttpStatus;
  4. import org.apache.commons.httpclient.URIException;
  5. import org.apache.commons.httpclient.methods.GetMethod;
  6. import org.apache.commons.httpclient.methods.PostMethod;
  7. import org.apache.commons.httpclient.params.HttpMethodParams;
  8. import org.apache.commons.httpclient.util.URIUtil;
  9. import org.apache.commons.logging.Log;
  10. import org.apache.commons.logging.LogFactory;
  11. import org.json.JSONException;
  12. import org.json.JSONObject;
  13.  
  14. import java.io.BufferedReader;
  15. import java.io.IOException;
  16. import java.io.InputStreamReader;
  17. import java.util.HashMap;
  18. import java.util.Iterator;
  19. import java.util.Map;
  20.  
  21. /**
  22. * HTTP工具箱
  23. *
  24. * @author leizhimin 2009-6-19 16:36:18
  25. * @author dlf 2014 12 20 00:19
  26.  */
  27. public final class HttpTookit {
  28. private static Log log = LogFactory.getLog(HttpTookit.class);
  29.  
  30. /**
  31. * 执行一个HTTP GET请求,返回请求响应的HTML
  32. *
  33. * @param url 请求的URL地址
  34. * @param queryString 请求的查询参数,可以为null
  35. * @param charset 字符集
  36. * @param pretty 是否美化
  37. * @return 返回请求响应的HTML
  38. */
  39. public static String doGet(String url, String queryString, String charset, boolean pretty) {
  40. StringBuffer response = new StringBuffer();
  41. HttpClient client = new HttpClient();
  42. HttpMethod method = new GetMethod(url);
  43. try {
  44. if (queryString!=null)
  45. //对get请求参数做了http请求默认编码,好像没有任何问题,汉字编码后,就成为%式样的字符串
  46. method.setQueryString(URIUtil.encodeQuery(queryString));
  47. client.executeMethod(method);
  48. if (method.getStatusCode() == HttpStatus.SC_OK) {
  49. BufferedReader reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), charset));
  50. String line;
  51. while ((line = reader.readLine()) != null) {
  52. if (pretty)
  53. response.append(line).append(System.getProperty("line.separator"));
  54. else
  55. response.append(line);
  56. }
  57. reader.close();
  58. }
  59. } catch (URIException e) {
  60. log.error("执行HTTP Get请求时,编码查询字符串“" + queryString + "”发生异常!", e);
  61. } catch (IOException e) {
  62. log.error("执行HTTP Get请求" + url + "时,发生异常!", e);
  63. } finally {
  64. method.releaseConnection();
  65. }
  66. return response.toString();
  67. }
  68.  
  69. /**
  70. * 执行一个HTTP POST请求,返回请求响应的HTML
  71. *
  72. * @param url 请求的URL地址
  73. * @param params 请求的查询参数,可以为null
  74. * @param charset 字符集
  75. * @param pretty 是否美化
  76. * @return 返回请求响应的HTML
  77. */
  78. public static String doPost(String url, Map<String, String> params, String charset, boolean pretty) {
  79. StringBuffer response = new StringBuffer();
  80. HttpClient client = new HttpClient();
  81. HttpMethod method = new PostMethod(url);
  82. //设置Http Post数据
  83. if (params != null) {
  84. HttpMethodParams p = new HttpMethodParams();
  85. for (Map.Entry<String, String> entry : params.entrySet()) {
  86. p.setParameter(entry.getKey(), entry.getValue());
  87. }
  88. method.setParams(p);
  89. }
  90. try {
  91. client.executeMethod(method);
  92. if (method.getStatusCode() == HttpStatus.SC_OK) {
  93. BufferedReader reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), charset));
  94. String line;
  95. while ((line = reader.readLine()) != null) {
  96. if (pretty)
  97. response.append(line).append(System.getProperty("line.separator"));
  98. else
  99. response.append(line);
  100. }
  101. reader.close();
  102. }
  103. } catch (IOException e) {
  104. log.error("执行HTTP Post请求" + url + "时,发生异常!", e);
  105. } finally {
  106. method.releaseConnection();
  107. }
  108. return response.toString();
  109. }
  110.  
  111. /***
  112. * 将json转换为map
  113. * @param jsonString
  114. * @return
  115. * @throws JSONException
  116. */
  117. public static Map<String, String> toMap(String jsonString) throws JSONException {
  118.  
  119. JSONObject jsonObject = new JSONObject(jsonString);
  120.  
  121. Map<String, String> result = new HashMap<String, String>();
  122. Iterator<?> iterator = jsonObject.keys();
  123. String key = null;
  124. String value = null;
  125.  
  126. while (iterator.hasNext()) {
  127.  
  128. key = (String) iterator.next();
  129. value = jsonObject.getString(key);
  130. result.put(key, value);
  131.  
  132. }
  133. return result;
  134.  
  135. }
  136. public static void main(String[] args) {
  137. String isbn="9787560612850";
  138. String uri="https://api.douban.com/v2/book/isbn/:"+isbn;
  139. parse(uri);
  140. }
  141.  
  142. public static void parse(String uri) {
  143. String y = doGet(uri, null, "UTF-8", true);
  144. // System.out.println(y);
  145. y=y.replace("\"", "'"); //将得到的json数据中的双引号改为单引号
  146.  
  147. y=y.replaceAll("\\\\","/"); //以下步骤将\改为/(url有用)
  148. y=y.replaceAll("//","/");
  149.  
  150. // System.out.println(y);
  151. Map<String, String> map=null;
  152. try {
  153. map = toMap(y);
  154. } catch (JSONException e) {
  155. // TODO Auto-generated catch block
  156. System.out.println("解析错误");
  157. e.printStackTrace();
  158. }
  159.  
  160. iteator(map);
  161. print(map);
  162. }
  163.  
  164. /***
  165. * 打印书的所有信息
  166. * @param map
  167. */
  168. public static void iteator(Map<String, String> map){
  169. Iterator<?> iter = map.entrySet().iterator();
  170. String key,value;
  171. while(iter.hasNext()) {
  172. Map.Entry entry = (Map.Entry)iter.next();
  173.  
  174. key = (String)entry.getKey();
  175. value = (String)entry.getValue();
  176. System.out.println(key+" "+value);
  177. }
  178. }
  179.  
  180. /***
  181. * 打印书的关键信息
  182. * @param map
  183. */
  184. public static void print(Map<String, String> map){
  185. System.out.println("*********");
  186. System.out.println("书名 "+map.get("title"));
  187. String author=map.get("author").toString();
  188. author=author.replace("[", "");
  189. author=author.replace("]", "");
  190. author=author.replace("\"", "");
  191. System.out.println("作者 "+author);
  192. System.out.println("原价格 "+map.get("price"));
  193. System.out.println("出版社 "+map.get("publisher"));
  194. System.out.println("出版日期 "+map.get("pubdate"));
  195. System.out.println("isbn "+map.get("isbn10"));
  196. Map<String, String> map2=null;
  197. try {
  198. map2=toMap(map.get("images").toString().replace("\"", "'"));
  199. } catch (JSONException e) {
  200. // TODO Auto-generated catch block
  201. e.printStackTrace();
  202. }
  203. System.out.println("small images "+map2.get("small"));
  204. System.out.println("medium images "+map2.get("medium"));
  205. System.out.println("small large "+map2.get("large"));
  206.  
  207. }
  208. }

参考资料

//http://lavasoft.blog.51cto.com/62575/175911/

//http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html

根据isbn获得图书的所有信息的更多相关文章

  1. 图书检索系统C版本

    原创,转载请注明出处! 程序具有一下功能窗口界面1,Input输入(读入文件,所有的文件都读入)2,Output输出(检验是否读取正确,从结构体数组读入)3,Length统计(此文件里有110本图书) ...

  2. C项目实践--图书管理系统(4)

    前面已经把图书管理系统的所有功能模块都已实现完毕了,下面通过运行来分析该系统的操作流程并检验是否符合逻辑设计要求. 3.系统操作过程 F5 运行 1.登录系统 系统运行之后,提示输入用户名和密码,系统 ...

  3. C项目实践--图书管理系统(1)

    1.功能需求分析 图书管理系统主要用于对大量的图书信息,包括书名.作者.出版社.出版日期.ISBN(书号)等进行增.删.改.查以及保存等操作.同时也包括对用户的管理,用户包括管理员和普通用户两种权限, ...

  4. C项目实践--图书管理系统(2)

    前面在<<C项目实践-图书管理系统(1)>>中把系统中的三大功能模块中可能涉及到的常量,结构体及相关函数进行了声明定义,下来就来实现它们. 执行系统首先从登录到系统开始,所以首 ...

  5. Django框架之图书管理系统(一)

    图书管理系统共分为两篇博客进行讲解,该篇博客主要记录图书与出版社之间的关系(一对一),记录图书的增删查改操作 ============================================= ...

  6. ISBN|方正|超星|The national academies press|OECD|RSC|Springer Link|Knovel|Encyclopedia Britannica

    图书使用图书分类号ISBN作为图书的ID 大英百科全书(Encyclopedia Britannica)可用于找寻关键词或关键词相关信息,便于构建准确的检索式: Knovel:可使用物理化学性质查找相 ...

  7. 如何使用API接口批量查询图书信息?

    之前小编讲过在Excel表格中根据ISBN查询图书信息可以使用我们的图书查询公式,但偶然间发现少部分书籍由于年份久远导致查不出来,今天小编就教给大家另一种查询图书信息的方式,即通过API接口返回的JS ...

  8. springboot+bootstrap实现图书商城管理(大三下学期课程设计)

    在csdn上记一次自己的课程设计过程(已经实习两个月了.感觉这个很容易做.支付可能需要多花点时间.): 在此框架基础之上权限认证管理设置成功:https://blog.csdn.net/weixin_ ...

  9. 实现 Castor 数据绑定--转

    第 1 部分: 安装和设置 Castor 数据绑定风靡一时 在 XML 新闻组.邮件列表和网站的讨论论坛中(在 参考资料 中可以找到这些内容的链接),最常见的一个主题就是数据绑定.Java 和 XML ...

随机推荐

  1. 基于BaseAdapter的Listview小Demo

    ListView是android开发中比较常用的控件, 其中适配器模式可以选择: ArrayAdapter:简单易用,通常用于将数组或者List集合的读个包值封装成多个列表项 SimpleAdapte ...

  2. mysql进阶(二十八)MySQL GRANT REVOKE用法

    mysql进阶(二十八)MySQL GRANT REVOKE用法   MySQL的权限系统围绕着两个概念: 认证->确定用户是否允许连接数据库服务器: 授权->确定用户是否拥有足够的权限执 ...

  3. 错误问题:OpenGL version to old,GLViewinitWithRect(const stdbasic_stringchar,stdchar_traitschar,stdalloca

     1电脑装成Linux之后,在Linux里面装虚拟机运行cocos2d-x-3.2时报如下错误: plan3d.exe!cocos2d::GLView::initWithRect(const st ...

  4. java.io.FileNotFoundException: ..\lib\commons-el.jar

    安装openfire成功后,启动遇到java.io.FileNotFoundException: ..\lib\commons-el.jar错误,并不是缺少了jar包,只需以管理员身份运行即可解决.

  5. JBOSS EAP 6 系列三 Oracle、Mysql数据源的配置(驱动)—认识模块的使用

    本文介绍JBOSS EAP 6.2中Oracle数据源的配置方式.结合之前JBOSS EAP 6.2新功能,本文初识JBOSS模块申明式容器这一特性. 模块申明式容器:JBOSS EAP不再有lib的 ...

  6. Java 中的日期与时间

    Java 日期时间 标签 : Java基础 Date java.util.Date对象表示一个精确到毫秒的瞬间; 但由于Date从JDK1.0起就开始存在了,历史悠久,而且功能强大(既包含日期,也包含 ...

  7. picasso图片缓存框架

    picasso是Square公司开源的一个Android图形缓存库,地址http://square.github.io/picasso/,可以实现图片下载和缓存功能. picasso使用简单,如下 [ ...

  8. MySQL 实现调用外部程序和系统命令

    MySQL 实现调用外部程序和系统命令 Refer:http://www.cnblogs.com/yunsicai/p/4080864.html1) Download lib_mysqludf_sys ...

  9. Ext JS 6开发实例(二) :使用CMD创建应用程序

    由于Ext JS 6将原来的Ext JS和Sencha Touch合并为一个框架,因而在使用CMD来创建应用程序前,需要考虑清楚你是要创建一个通用应用程序,还是仅仅只是针对桌面或移动设备的应用程序. ...

  10. Java中怎么简单的使用正则表达式?

    对于正则表达式,我通常的认识就是通过一些陌生的奇怪的符号就可以完成很复杂事件的好帮手!实际上正则表达式确实是这方面的好助手,接下来让我们一起认识一下Java中怎么使用正则表达式吧. 初见Pattern ...