前面讲到的请求都是get请求,现在讲讲用jmeter发送post请求。首先在登录的接口里,添加post请求:

jmeter教程(五):请求数据为json及请求头

这个post请求,实际上就是调用get请求的方法。这里,我就不部署到linux,直接在本机上启动服务,新建一个脚本,添加线程组,线程组中添加HTTP请求、察看结果树,HTTP请求配置好各项参数,方法现在使用POST。

jmeter教程(五):请求数据为json及请求头

保存,运行脚本

jmeter教程(五):请求数据为json及请求头

可以看到脚本也运行成功了,现在是服务器的接口,即可以使用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应用,直接使用浏览器的调试工具也可以看到请求的详细信息,比如我现在这个请求,在页面调用一下,在浏览器的调试信息就是下面这样的

jmeter教程(五):请求数据为json及请求头

这里,我使用的谷歌浏览器,可以看到请求的信息分为了四个部分,最上面的是Genaral,就是请求的基本信息,Response Headers就是响应头信息,Request Headers就是请求头信息,Request Payload就是请求数据。可以看到请求数据中参数是用花括号括起来的,这就是json的格式。现在,要使用jmeter来发送这个请求,怎么添加json数据

jmeter教程(五):请求数据为json及请求头

添加json格式的数据,在Body Data里面添加,但是现在点不过去,因为现在加了键值对的参数,需要先把加的这两个参数删掉,才可以点过去

jmeter教程(五):请求数据为json及请求头

这样就添加好了json的请求参数,这里的格式,一定注意:花括号自不必说,要有。参数名,一定要用双引号引起来,参数的值,如果是字符串,也要用双引号引起来,如果是数字就不需要用引号了。每个参数之间用英文逗号分隔开。当然了,这里面,一样也可以使用变量,比如用户名使用变量,可以写成这样:"username":"${username}"。但是现在就这样运行,还是会报错的,因为服务器并不知道你传的是一个json,所以需要告诉服务器传的是一个json,按json解析数据。因为在服务器上,解析json为对象,都是框架做的,不像现在这个接口,解析json放在接口的里面处理了。添加请求头

jmeter教程(五):请求数据为json及请求头

http请求上右击,添加——配置元件——HTTP信息头管理器

jmeter教程(五):请求数据为json及请求头

这个请求头,在上面浏览器的调试工具截图里,请求头部分,也可以看到有。当然有一些请求还会添加一些其它特殊的请求头,如果用jmeter发请求,不带相应的请求头,就会报错。比如登录页面的验证码图片,请求验证码的时候就会需要一个请求头来指明验证码的图片的格式,这些都可以用浏览器或是app调用一次接口,然后看接口调用信息里的请求头找到。

保存脚本,运行,看运行结果,成功!

jmeter教程(五):请求数据为json及请求头

时间都花在写接口上了。。。

相关文章:

  • 2021-07-18
  • 2021-11-23
  • 2022-12-23
  • 2021-08-12
  • 2021-08-14
  • 2022-12-23
  • 2021-06-17
猜你喜欢
  • 2021-09-03
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-08-08
  • 2021-12-21
  • 2022-12-23
相关资源
相似解决方案