1.通过java实现自动化接口访问(二)登录获取的token,查询书籍,需授权用户才可查询
2.接口的地址:http://localhost:8080/searchbooks
3.请求的方式:post
4.请求的结果:
A、查询所有书籍
B、根据bookid查询
C、根据bookname模糊查询
D、根据价格查询
前置条件:
1、 在postman的Authorization的type中选择Bearer Token中数据,输入登录成功后,拿到token。
2、在postMan中输入登录时输入的登录名,还有需要查询的参数
预期:
请求对应searchbook代码,返回的book是否是预期的book
1.工程结构说明
2.Authorization,searchError,bearerToken,CreateKey和JdbcUtils源码已经在java实现自动化接口访问(二)中,再次就不在赘述
3.Book.java源码
package com.test.entities;
public class Book {
private int bookId;
private String bookName;
private String bookAuthor;
private double bookPrice;
public int getBookId() {
return bookId;
}
public void setBookId(int bookId) {
this.bookId = bookId;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
public String getBookAuthor() {
return bookAuthor;
}
public void setBookAuthor(String bookAuthor) {
this.bookAuthor = bookAuthor;
}
public double getBookPrice() {
return bookPrice;
}
public void setBookPrice(double bookPrice) {
this.bookPrice = bookPrice;
}
@Override
public String toString() {
return "Book [bookId=" + bookId + ", bookName=" + bookName
+ ", bookAuthor=" + bookAuthor + ", bookPrice=" + bookPrice
+ "]";
}
}
4.BookDao.java源码
package com.test.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.test.entities.Book;
import com.test.utils.JdbcUtils;
/**
* DAO,实现数据库的实际访问
* @author lfz
*
*/
public class BookDao {
/**
* 根据给定的sql和参数进行数据库查询,并将结果转成对象返回
* @param sql 需要执行的select语句
* @param args select查询语句中占位符所需的参数
* @return select查询后返回的对象集合
*/
public List getBooks(String sql, Object...args){
List books = new ArrayList<>();
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection(); // 获取数据库连接
ps = conn.prepareStatement(sql); // 创建带有占位符的语句对象
for(int i = 0; i < args.length; i++) {
ps.setObject(i+1, args[i]); // 对占位符进行实际赋值
}
rs = ps.executeQuery(); // 执行sql语句,并获取返回
while(rs.next()) { // 根据返回进行记录的逐条遍历
Book book = new Book();
book.setBookId(rs.getInt("bid"));
book.setBookName(rs.getString("bname"));
book.setBookAuthor(rs.getString("author"));
book.setBookPrice(rs.getDouble("price"));
books.add(book); // 每一条记录代表一个book对象,添加到集合中
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JdbcUtils.close(conn, ps, rs); // 关闭数据库连接
}
return books;
}
}
5.SearchBookResult.java源码
package com.test.entities;
import java.util.List;
/**
* 返回用户的查询数据结果实例
*
* @author lfz
*
*/
public class SearchBookResult {
/**
* 查询的符合条件的书籍数量
*/
private int count;
/**
* 符合查询条件的书籍集合
*/
private List books;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public List getBooks() {
return books;
}
public void setBooks(List books) {
this.books = books;
}
@Override
public String toString() {
return "SearchBookResult [count=" + count + ", books=" + books + "]";
}
}
6.SearchBookService.java源码
package com.test.services;
import java.util.ArrayList;
import java.util.List;
import com.test.dao.BookDao;
import com.test.entities.Book;
/**
* 查询数据库中书籍信息的服务
* @author liudao
*
*/
public class SearchBookService {
/**
* 用于对输入指定筛选条件信息数据库查询的方法
* @param bookId 对应书籍的id,可以为空
* @param bookName 对应书籍的名字,支持模糊查询,可为空
* @param bookAuthor 对应书籍的作者,支持模糊查询,可为空
* @param bookPrice 对应书籍的价格,表示不超过这个价格的书籍,可为空
* @return 所有符合条件的book对象集合
*/
public List getBooks(String bookId, String bookName, String bookAuthor, String bookPrice){
List books = null;
String sql = "select * from books where "; // 不完整的sql语句,最后的where用于和之后的筛选条件拼接
List
7.SearchBook.java源码
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Gson gson = new GsonBuilder().create();
String json = null;
request.setCharacterEncoding("utf-8");
String authToken = request.getHeader("Authorization"); // 获取用户请求中传递的header:Authorization
Object obj = getServletContext().getAttribute("secretKey"); // 从服务端的servlet上下文中获取secretKey属性
Cookie[] cookies = request.getCookies(); // 获取客户端请求中所附加的所有cookie
Cookie cookie = null;
if(cookies != null) { // 如果客户端有cookie传递到服务端,则对所有的cookie进行检测,是否有名为expir的cookie
for(int i = 0; i < cookies.length; i++) {
if(cookies[i].getName().equals("expir")) { // 如果找到expir的cookie,则退出循环
cookie = cookies[i];
break;
}
}
}
if(authToken!=null && authToken.startsWith("Bearer") && cookie != null && obj != null) {
authToken = authToken.substring(7); // 由于Authorization的值是Bearer XXXXX,要将XXXX的值取出,需要去掉前面7个字符
Date expir = new Date(Long.parseLong(cookie.getValue())); // 从cookie中取出过期时间的毫秒表达式,从字符串转换为long类型后,生成Date对象
String user = request.getParameter("user"); // 从request参数中取出用户名
SecretKey key = (SecretKey)obj; // 获取私钥
String token = BearerToken.createToken(key, user, expir); // 通过用户名和过期时间重新计算token
if(token.equals(authToken)) { // 将重新计算的token和请求中传递的token进行对比,如果一致则表示该请求合法
// 获取请求中传递的id、name、author、price
String bookId = request.getParameter("id");
String bookName = request.getParameter("name");
String bookAuthor = request.getParameter("author");
String bookPrice = request.getParameter("price");
// 调用SearchBookService获取查询结果
SearchBookService sbs = new SearchBookService();
List books = sbs.getBooks(bookId, bookName, bookAuthor, bookPrice);
if(books.size() > 0) { // 如果返回的结果不是空集合,则表示查询成功
//设置返回结构
SearchBookResult sbr = new SearchBookResult();
sbr.setCount(books.size());
sbr.setBooks(books);
json = gson.toJson(sbr);
}else {
// 如果是空集合,则表示未找到,设置错误返回
SearchError se = new SearchError();
se.setErrorCode(100);
se.setMessage("未找到指定的内容");
json = gson.toJson(se);
}
}else { // 如果两个token的值不一致,则表示认证失败
SearchError se = new SearchError();
se.setErrorCode(103);
se.setMessage("认证失败,请确定token是否有效");
json = gson.toJson(se);
}
}else { // 如果缺失任何一种认证信息,则进行错误返回
SearchError se = new SearchError();
se.setErrorCode(104);
se.setMessage("缺失认证信息");
json = gson.toJson(se);
}
response.setCharacterEncoding("utf-8");
response.setContentType("application/json");
PrintWriter out = response.getWriter();
out.print(json);
out.flush();
}
}
1、前置条件:
A、登录后,拿到token
B、将token输入到Bearer Token中
C、在body部分需要输入登录的名字(必须),需要查询的字段(非必须)
2、发送请求