java实现自动化测试接口访问(三)--查询书籍的api接口

一、待测试的接口说明

1.通过java实现自动化接口访问(二)登录获取的token,查询书籍,需授权用户才可查询
2.接口的地址:http://localhost:8080/searchbooks
3.请求的方式:post
4.请求的结果:
A、查询所有书籍
java实现自动化测试接口访问(三)--查询书籍的api接口_第1张图片
B、根据bookid查询
java实现自动化测试接口访问(三)--查询书籍的api接口_第2张图片
C、根据bookname模糊查询
java实现自动化测试接口访问(三)--查询书籍的api接口_第3张图片
D、根据价格查询
java实现自动化测试接口访问(三)--查询书籍的api接口_第4张图片

二、测试目标

前置条件:
1、 在postman的Authorization的type中选择Bearer Token中数据,输入登录成功后,拿到token。
2、在postMan中输入登录时输入的登录名,还有需要查询的参数

预期:
请求对应searchbook代码,返回的book是否是预期的book

三、新建Java Web项目##

1.工程结构说明
java实现自动化测试接口访问(三)--查询书籍的api接口_第5张图片
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 listArgs = new ArrayList<>(); // 用于输入到sql中的占位参数,对应sql中“?”占位符
		if(bookId!=null && !bookId.equals("")) { // 如果bookid不为空
			int id = Integer.parseInt(bookId); // 将id转为int类型
			sql = sql + "bid=? and ";  // sql语句中拼接bookid的筛选条件
			listArgs.add(id); // 将id的值加入到参数中
		}
		if(bookName!=null && !bookName.equals("")) { // 如果bookname不为空
			sql = sql + "bname like ? and "; // 拼接book_name的筛选条件
			listArgs.add("%"+bookName+"%"); // 将模糊查询条件加入参数集合中
		}
		if(bookAuthor!=null && !bookAuthor.equals("")) { // 如果bookauthor不为空
			sql = sql + "author like ? and "; // 拼接book_author的筛选条件
			listArgs.add("%"+bookAuthor+"%"); // 将模糊查询条件加入参数集合中
		}
		if(bookPrice!=null && !bookPrice.equals("")) { // 如果bookprice不为空
			double price = Double.parseDouble(bookPrice); 
			sql = sql + "price<=? and "; // 拼接book_price的筛选条件
			listArgs.add(price); //将price的值加入到参数中
		}
		sql = sql + "1=1"; // 最后拼接1=1恒true表达式,用于结尾,否则sql最后留下一个and关键字,语法错误
		BookDao bookDao = new BookDao();
		books = bookDao.getBooks(sql, listArgs.toArray()); // 将组织好的sql,和传递的参数交给DAO进行数据库实际访问
		return books;
	}
}
 
  

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();
	
}

}

四、使用postman访问api接口

1、前置条件:
A、登录后,拿到token
B、将token输入到Bearer Token中
java实现自动化测试接口访问(三)--查询书籍的api接口_第6张图片
C、在body部分需要输入登录的名字(必须),需要查询的字段(非必须)
java实现自动化测试接口访问(三)--查询书籍的api接口_第7张图片
2、发送请求
java实现自动化测试接口访问(三)--查询书籍的api接口_第8张图片

你可能感兴趣的:(接口)