前面讲到的请求都是get请求,现在讲讲用jmeter发送post请求。首先在登录的接口里,添加post请求:
这个post请求,实际上就是调用get请求的方法。这里,我就不部署到linux,直接在本机上启动服务,新建一个脚本,添加线程组,线程组中添加HTTP请求、察看结果树,HTTP请求配置好各项参数,方法现在使用POST。
保存,运行脚本
可以看到脚本也运行成功了,现在是服务器的接口,即可以使用GET方法提交,也可以使用POST方法提交,如果接口中没有添加doGet的方法,那么使用GET方法提交就会报错。现在我改下服务器里,接口的代码
package king;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Login extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
String cType = request.getHeader("content-type");
if(!"application/json".equals(cType)){
writer.write("Bad Request");
response.setStatus(400);
return;
}
BufferedReader reader = null;
try{
reader = new BufferedReader(new InputStreamReader(request.getInputStream()));
StringBuffer sb = new StringBuffer();
String temp = null;
while((temp = reader.readLine()) != null){
sb.append(temp);
}
User user = json2Bean(sb.toString().trim(), User.class);
if("qwertyui".equals(user.getUsername()) && "12345678".equals(user.getPassword())){
writer.write("登录成功!");
}else{
writer.write("登录失败!");
}
}finally{
reader.close();
}
}
//将json字符串封装为对象,很简陋的一个方法,没有通用和适配性,纯是做演示用的
private <T> T json2Bean(String json, Class<T> clazz) {
T t;
try {
t = clazz.newInstance();
json = json.substring(1, json.length()-1);
String[] fields = json.split(",");
for(String field : fields){
String[] temps = field.split("\\s*\"\\s*:\\s*\"\\s*");
Method method = clazz.getMethod("set"+firstUpperCase(temps[0].split("\\s*\"\\s*")[1]), String.class);
method.invoke(t, temps[1].split("\\s*\"\\s*")[0]);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return t;
}
//将字符串的第一个字母变为大写
private String firstUpperCase(String str){
return str.substring(0,1).toUpperCase()+str.substring(1);
}
}
User类:
package king;
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [id=" + id + ", username=" + username + ", password=" + password + "]";
}
}
现在,这个接口只有POST请求,而且接收的数据,要是json格式的,如果还是使用之前的方式来调用接口的话,是会出错的。这种情况,用badboy录制脚本的话,也是会出问题的。现在问题来了,要怎么知道请求的数据,是json,还是前面讲的键值对的形式呢?看开发提供的接口文档,但是有的公司没有接口文档,而且很多接口也未必就是现在的开发人员开发的,所以很多东西,还是要自己去尝试。如果是老的接口,那么肯定有web页面或是app可以调用得到。这个时候就可以在应用里操作一次,然后用抓包工具,抓一下包就可以知道了。如果是pc端的web应用,直接使用浏览器的调试工具也可以看到请求的详细信息,比如我现在这个请求,在页面调用一下,在浏览器的调试信息就是下面这样的
这里,我使用的谷歌浏览器,可以看到请求的信息分为了四个部分,最上面的是Genaral,就是请求的基本信息,Response Headers就是响应头信息,Request Headers就是请求头信息,Request Payload就是请求数据。可以看到请求数据中参数是用花括号括起来的,这就是json的格式。现在,要使用jmeter来发送这个请求,怎么添加json数据
添加json格式的数据,在Body Data里面添加,但是现在点不过去,因为现在加了键值对的参数,需要先把加的这两个参数删掉,才可以点过去
这样就添加好了json的请求参数,这里的格式,一定注意:花括号自不必说,要有。参数名,一定要用双引号引起来,参数的值,如果是字符串,也要用双引号引起来,如果是数字就不需要用引号了。每个参数之间用英文逗号分隔开。当然了,这里面,一样也可以使用变量,比如用户名使用变量,可以写成这样:"username":"${username}"。但是现在就这样运行,还是会报错的,因为服务器并不知道你传的是一个json,所以需要告诉服务器传的是一个json,按json解析数据。因为在服务器上,解析json为对象,都是框架做的,不像现在这个接口,解析json放在接口的里面处理了。添加请求头
http请求上右击,添加——配置元件——HTTP信息头管理器
这个请求头,在上面浏览器的调试工具截图里,请求头部分,也可以看到有。当然有一些请求还会添加一些其它特殊的请求头,如果用jmeter发请求,不带相应的请求头,就会报错。比如登录页面的验证码图片,请求验证码的时候就会需要一个请求头来指明验证码的图片的格式,这些都可以用浏览器或是app调用一次接口,然后看接口调用信息里的请求头找到。
保存脚本,运行,看运行结果,成功!
时间都花在写接口上了。。。