天天看點

根據isbn獲得圖書的所有資訊

幾點說明

1這個豆瓣的api

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

可以以json的形式傳回書籍的所有資訊

2最開始的時候是我自己寫的用代碼模拟http請求(參考的是​​http://www.jb51.net/article/47070.htm​​)

但不知道為何會有亂碼問題 有亂碼不怕 怕的就是并不是所有的中文都是亂碼 例如在傳回出版社資訊的時候 長江出版社 這幾個字 長江出版可以顯示 但是那個社就是兩個問号 頭疼了好長時間

3 寫這個的時候 還碰到一個問題 就是關于字元替換 replace 與replaceAll 後者使用的是正規表達式 而且把\變成/ 着實讓我頭疼了一下

最後的效果

根據isbn獲得圖書的所有資訊
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.URIException;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.commons.httpclient.util.URIUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONException;
import org.json.JSONObject;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
* HTTP工具箱
*
* @author leizhimin 2009-6-19 16:36:18
* @author dlf 2014 12 20 00:19
 */
public final class HttpTookit {
        private static Log log = LogFactory.getLog(HttpTookit.class);

        /**
         * 執行一個HTTP GET請求,傳回請求響應的HTML
         *
         * @param url                 請求的URL位址
         * @param queryString 請求的查詢參數,可以為null
         * @param charset         字元集
         * @param pretty            是否美化
         * @return 傳回請求響應的HTML
         */
        public static String doGet(String url, String queryString, String charset, boolean pretty) {
                StringBuffer response = new StringBuffer();
                HttpClient client = new HttpClient();
                HttpMethod method = new GetMethod(url);
                try {
                        if (queryString!=null)
                                //對get請求參數做了http請求預設編碼,好像沒有任何問題,漢字編碼後,就成為%式樣的字元串
                                method.setQueryString(URIUtil.encodeQuery(queryString));
                        client.executeMethod(method);
                        if (method.getStatusCode() == HttpStatus.SC_OK) {
                                BufferedReader reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), charset));
                                String line;
                                while ((line = reader.readLine()) != null) {
                                        if (pretty)
                                                response.append(line).append(System.getProperty("line.separator"));
                                        else
                                                response.append(line);
                                }
                                reader.close();
                        }
                } catch (URIException e) {
                        log.error("執行HTTP Get請求時,編碼查詢字元串“" + queryString + "”發生異常!", e);
                } catch (IOException e) {
                        log.error("執行HTTP Get請求" + url + "時,發生異常!", e);
                } finally {
                        method.releaseConnection();
                }
                return response.toString();
        }

        /**
         * 執行一個HTTP POST請求,傳回請求響應的HTML
         *
         * @param url         請求的URL位址
         * @param params    請求的查詢參數,可以為null
         * @param charset 字元集
         * @param pretty    是否美化
         * @return 傳回請求響應的HTML
         */
        public static String doPost(String url, Map<String, String> params, String charset, boolean pretty) {
                StringBuffer response = new StringBuffer();
                HttpClient client = new HttpClient();
                HttpMethod method = new PostMethod(url);
                //設定Http Post資料
                if (params != null) {
                        HttpMethodParams p = new HttpMethodParams();
                        for (Map.Entry<String, String> entry : params.entrySet()) {
                                p.setParameter(entry.getKey(), entry.getValue());
                        }
                        method.setParams(p);
                }
                try {
                        client.executeMethod(method);
                        if (method.getStatusCode() == HttpStatus.SC_OK) {
                                BufferedReader reader = new BufferedReader(new InputStreamReader(method.getResponseBodyAsStream(), charset));
                                String line;
                                while ((line = reader.readLine()) != null) {
                                        if (pretty)
                                                response.append(line).append(System.getProperty("line.separator"));
                                        else
                                                response.append(line);
                                }
                                reader.close();
                        }
                } catch (IOException e) {
                        log.error("執行HTTP Post請求" + url + "時,發生異常!", e);
                } finally {
                        method.releaseConnection();
                }
                return response.toString();
        }
        
        /***
         * 将json轉換為map
         * @param jsonString
         * @return
         * @throws JSONException
         */
        public static Map<String, String> toMap(String jsonString) throws JSONException  {

            JSONObject jsonObject = new JSONObject(jsonString);
            
            Map<String, String> result = new HashMap<String, String>();
            Iterator<?> iterator = jsonObject.keys();
            String key = null;
            String value = null;
            
            while (iterator.hasNext()) {

                key = (String) iterator.next();
                value = jsonObject.getString(key);
                result.put(key, value);

            }
            return result;

        }
        public static void main(String[] args) {
            String isbn="9787560612850";
            String uri="https://api.douban.com/v2/book/isbn/:"+isbn;
            parse(uri);
        }

        public static void parse(String uri)  {
                String y = doGet(uri, null, "UTF-8", true);
            //    System.out.println(y);
                y=y.replace("\"", "'");  //将得到的json資料中的雙引号改為單引号
                
                y=y.replaceAll("\\\\","/");   //以下步驟将\改為/(url有用)
                y=y.replaceAll("//","/");

            //    System.out.println(y);
                Map<String, String> map=null;
                try {
                    map = toMap(y);
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    System.out.println("解析錯誤");
                    e.printStackTrace();
                }
                
                iteator(map);
                print(map);       
        }

        /***
         * 列印書的所有資訊
         * @param map
         */
        public static void  iteator(Map<String, String> map){
             Iterator<?> iter = map.entrySet().iterator();
             String key,value;
             while(iter.hasNext()) {
                 Map.Entry entry = (Map.Entry)iter.next();

                 key = (String)entry.getKey();
                 value = (String)entry.getValue();
                 System.out.println(key+"   "+value);
             }
        }
        
        
        /***
         * 列印書的關鍵資訊
         * @param map
         */
        public static  void print(Map<String, String> map){
            System.out.println("*********");
            System.out.println("書名  "+map.get("title"));
            String author=map.get("author").toString();
            author=author.replace("[", "");
            author=author.replace("]", "");
            author=author.replace("\"", "");
            System.out.println("作者  "+author);
            System.out.println("原價格  "+map.get("price"));
            System.out.println("出版社  "+map.get("publisher"));
            System.out.println("出版日期  "+map.get("pubdate"));
            System.out.println("isbn  "+map.get("isbn10"));
            Map<String, String> map2=null;
            try {
                map2=toMap(map.get("images").toString().replace("\"", "'"));
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("small images "+map2.get("small"));
            System.out.println("medium images "+map2.get("medium"));
            System.out.println("small large "+map2.get("large"));
            
        }
}      

參考資料

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