由于需要,自己要写一个书籍管理系统,但是大量的书籍录入太费时间和精力;所以使用了豆瓣提供的api,下面是过程,从一个什么都不懂的基础来记录。
1.进入豆瓣为开发者提供的网站
https://developers.douban.com/wiki/?title=book_v2
我需要的是图书api
2.使用java代码给发送get请求
/**
* 使用isbn码从豆瓣查询书籍信息
*
* @param url
*
* @param param 书籍的isbn13编码
*
* @return 返回豆瓣发来的json字符串
*/
public static String sendGet(String param) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = "https://api.douban.com/v2/book/isbn/:"+param;
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立实际的连接
connection.connect();
in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result; //返回得到的json字符串
}
3.解析json串,提取所需的信息
作者所需的是json的其中一部分,并非所有,处理json字符串代码如下:
Book类
/**
* 图书的类
* @author Andy
*
*/
public class Book {
private String bid;
private String bname;
private String pinyin;
private String isbn;
private String press;
private String author;
private int num;
private int shengyu;
private String image;
private String cid;
private String summary;
public String getBid() {
return bid;
}
public void setBid(String bid) {
this.bid = bid;
}
public String getBname() {
return bname;
}
public void setBname(String bname) {
this.bname = bname;
}
public String getPinyin() {
return pinyin;
}
public void setPinyin(String pinyin) {
this.pinyin = pinyin;
}
public String getIsbn() {
return isbn;
}
public void setIsbn(String isbn) {
this.isbn = isbn;
}
public String getPress() {
return press;
}
public void setPress(String press) {
this.press = press;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getShengyu() {
return shengyu;
}
public void setShengyu(int shengyu) {
this.shengyu = shengyu;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getCid() {
return cid;
}
public void setCid(String cid) {
this.cid = cid;
}
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
@Override
public String toString() {
return "Book [bid=" + bid + ", bname=" + bname + ", pinyin=" + pinyin
+ ", isbn=" + isbn + ", press=" + press + ", author=" + author
+ ", num=" + num + ", shengyu=" + shengyu + ", image=" + image
+ ", cid=" + cid + ", summary=" + summary + "]";
}
}
处理json的类方法
package com.telneting.bookmate.utils;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import net.sf.json.JSONObject;
import com.telneting.bookmate.book.domain.Book;
/**
* 使用get请求调用豆瓣api
* @author Andy
*
*/
public class DouBanUtils {
/**
* 使用isbn码从豆瓣查询书籍信息
*
* @param url
*
* @param param 书籍的isbn13编码
*
* @return 返回豆瓣发来的json字符串
*/
public static String sendGet(String param) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = "https://api.douban.com/v2/book/isbn/:"+param;
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立实际的连接
connection.connect();
in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
/**
* 将豆瓣的返回的json数据封装成Book对象
* @return
*/
public static Book toBook(String jsonStr){
JSONObject jsonObject = JSONObject.fromObject(jsonStr);
//提取所需要的字段
String bname = jsonObject.getString("title");
String isbn13 = jsonObject.getString("isbn13");
String press = jsonObject.getString("publisher");
List authors = (List) jsonObject.get("author");
String author = DouBanUtils.listToString(authors);
String summary = jsonObject.getString("summary");
Object imgs = jsonObject.get("images");
String image = DouBanUtils.getPic(imgs);
Book book = new Book();
book.setAuthor(author);
book.setBname(bname);
book.setIsbn(isbn13);
book.setPress(press);
book.setSummary(summary);
book.setImage(image);
return book;
}
/**
* 将List集合返回成字符串形式
* @return
*/
private static String listToString(List list){
String str = list.toString();
str = str.replace("\"", "");
str = str.replace("[", "");
str = str.replace("]", "");
str = str.replace(" ", "");
return str;
}
/**
* 从json里的子对象获取他的内容
* @param obj
* @return
*/
private static String getPic(Object obj){
JSONObject json = JSONObject.fromObject(obj.toString());
String img = json.getString("large");
return img;
}
}
4.测试类
@Test
public void fun2(){
String str = DouBanUtils.sendGet("9787115253699");
Book b = DouBanUtils.toBook(str);
System.out.println(b);
System.out.println(str);
}
简单好上手的东西,花了很多时间在找申请页面...原来不需要申请直接能使用;
像是聚合数据其他一些,就要申请数据,使用API时候需要使用一个key才能调用!