JMeter的编码与HTTP请求
记录一次Bug的查找
赶时间的小伙伴直接看结论即可。
结论
JMtmer的\r需要进行编码 编码为
POST请求,最好一定要带上Content-Length,Content-Type
SP 和 CR 不是一个东西 CR是回车,SP是空格
换行: Windows下为CRLF,Linux下为LF
问题:
Linnx下的JMeter 的发送SSL–RSA的POST请求,无法发送,返回码为 400, 提示 请求头异常,服务端不认识请求头。
环境简介:
Centos7 安装的 JMeter 5.2.1版本。
JMtmer实现SSL请求方式为:JMtmer调用Jar包,Jar包调用.so库实现 SSL。 而此时request请求是作为一个参数传入给Jar包的。
解决思路:
1. 查看请求头
检查了发送的请求头,发现代码里面写了 Content-Type:text的,而服务端需要使用application/json格式,于是我曾尝试加2个Content-Type,但是没有成功。这也引出来一个问题,同一个请求头,重复的字段,到底哪个生效?
2.使用Win下的JMeter测试
使用win下JMtmer 自带的SSL 进行测试—使用方法为:选项–SSL管理器–选择CA。然后http协议直接写https
结果是可以通过的-----说明后台服务不是异常的,错误还是在发送端。
3. 查看JMeter脚本
查看Linux的脚本,发现了在request参数那里,出现了M。出现M是因为linux编码不识别\r,在windows下的 回车换行(\r\n)(CRLF)到linux下就变成了^M/n。
想到应该是M不认识,那么将M去掉,再次执行jmx脚本。发现还是报400。
这时候想起来HTTP的请求标准:需要以/r/n进行结束。
我竟然傻傻的在请求的末尾加上了 space。然后进行测试,结果当然不通过。其实此时 末尾为 SPLF。
这时候 我的排查思路出现了偏差,我怀疑了Jar包是不是出现了问题。于是写Java的Demo放到Linux上跑,结果当时是过了。
Linux下的Java编译和运行
我的是同一个package下多个文件。
编译:
javac -encoding “utf-8” -sourcepath /root/ssl_jni/src/ -classpath /root/ssl_jni/classes/ /root/ssl_jni/src/cn/…/anxxx.java -d /root/ssl_jni/classes/
运行:
java -classpath /root/ssl_jni/classes cn/…/anxxx
这使我更加迷惑了,同样的请求内容,为什么JMeter不行,而Java执行却好用呢?其实仔细看,此时请求结尾都是以\r\n结尾的。
但是当时我很迷惑,明明都是一样的字符串,为啥一个好用,一个不好用呢?
于是我将不好用的字符串和 好用的字符串 挨个比Ascll码,结果我一下子就明白了。
很明显,SP!=CR 直到此时我才明白我犯了错误-----将SP和CR搞混了。
现在就是如何在JMtmer上表达CR了,受限于Linux,我根本不知道如何在Linux下的文本里表达CR。
4.峰回路转
我询问了同事,其中有一个同事说,可以看看xml对CR是怎么处理的。(因为JMeter脚本就是一个XML文件)。
这给了我灵感,我马上看windows下的JMtmer脚本是如何处理CR,忽然发现JMtmer脚本直接对换行做了HTML编码。
于是我在Linux上对脚本同样做了处理。结果请求成功了!(此时响应码为 500)
5.新问题
请求码报500,提示缺少Body。
此时我请求Body是Json字符串,Jmetr也会做编码。于是我查看了Linux下的JMtmer脚本,发现已经编码了。
又使用Java Demo进行请求。发现也会报 500 ,缺少头。
于是开始抓包,由于是SSL,需要wireshark进行解包,可是私钥是jks,需要导出p12格式的私钥。尤其注意,RSA的加密套件不能是ECDHE的算法,否则无法解析出来报文。
抓包查看了失败报文 和成功的报文对比,发现缺少关键请求头Content-Length,Content-Length的长度为Body的length,于是在Java Demo中加入了Content-Length请求可以成功了。
其实这是自己挖的坑,在一开始我会自动添加Content-Type和Content-Length,后来不需要自动添加Content-Type,我就直接也把Content-Length注释掉了。。。。
总结
- JMtmer的\r需要进行编码 编码为
- POST请求,最好一定要带上Content-Length,Content-Type
- SP 和 CR 不是一个东西 CR是回车,SP是空格
- 换行: Windows下为CRLF,Linux下为LF
最后: 可以在公众号:伤心的辣条 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!喜欢软件测试的小伙伴们,可以加入我们的测试技术交流扣扣群:914172719(里面有各种软件测试资源和技术讨论)
好文推荐
转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!
面试经:一线城市搬砖!又面软件测试岗,5000就知足了…
面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…
什么样的人适合从事软件测试工作?
那个准点下班的人,比我先升职了…
测试岗反复跳槽,跳着跳着就跳没了…
JMeter的编码与HTTP请求相关推荐
- JMeter插件模拟发送UDP请求:UDP sampler
JMeter安装UDP插件后支持发送UDP协议的请求包,官方介绍安装插件后可以用来测试DNS, NTP, TFTP, Boot servers and many-many other systems. ...
- jmeter中控制器3个请求其中一个访问不到_性能测试干货丨盘点JMeter常见的逻辑控制器...
JMeter提供了不同种类的逻辑控制器,包括循环(Loop),简单(Simple),事务型(Transaction),模块(Module),随机(Random)等.对于刚接触JMeter不久的用户,甚 ...
- jmeter校验结果_JMeter(1)--请求内容验证
样例:使用JMeter验证接口请求的返回内容 从http://zzk.cnblogs.com中搜索1,验证结果页面中是否存在内容:够不断地输出0 请求接口:http://zzk.cnblogs.com ...
- jmeter压测学习47-发soap请求测试webservice接口
前言 jmeter3 的版本可以新建一个SOAP/XML-RPC Request 的请求,直接测试webservice的接口. jmeter5.1.1 版本已经去掉了自带的SOAP/XML-RPC R ...
- 使用jMeter构造大量并发HTTP请求进行微服务性能测试
比如我开发好了一个微服务,想测试其在大并发请求下的性能表现如何. 比较方便的一个做法是使用工具jMeter来构造这些请求. 创建一个新的工程: 创建一个新的Thread Group,下图意思是这个工程 ...
- 页面编码和被请求的资源编码如果不一致如何处理
对于ajax请求传递的参数,如果是get请求,参数传递中文,在有些浏览器会乱码 不同的浏览器对参数编码的处理方式不同,所以对于get请求的参数需要使用 encodeURIComponent函数对参数进 ...
- jMeter 模拟 web 高并发请求
导航 一.jmeter 简介与下载 二.接口压测设置 三.实战演示 一.jmeter 简介与下载 Apache JMeter是Apache组织开发的基于Java的压力测试工具. 最初被设计用于Web应 ...
- 「Python 编程」编码实现网络请求库中的 URL 解析器
相信各位 Python 开发者都用过 Requests 库,有些朋友还用过 WebSockets 库.这里回顾一下它们的基本用法,例如使用 Requests 库向目标网站发出 GET 请求: impo ...
- JMeter配置元件【HTTP请求默认值】
1.HTTP请求默认值介绍 我们在JMeter中编辑测试计划时,如果有多个Sampler(取样器)请求中,参数和设置都是相同的,例如请求服务的IP地址.协议.端口号等,这些信息重复的配置在每个Samp ...
最新文章
- MSSQL Sql加密函数 hashbytes 用法简介
- ExecutorService(任务调度器)详解
- 瑞士银行开户条件有哪些,瑞士银行开户的流程及注意事项是什么?
- python中的if not语句_python中使用if not x 语句用法
- 用Java对HashMap排序
- java写便签_如何编写一个便签程序(用Java语言编写)
- PHP实现单件模式的几种方式
- 关于Python中的错误与异常,你是否了解的够仔细?
- 卷积神经网络——第一周 卷积神经网络基础——第四部分
- java使用bks双向认证_android客户端SSL单向双向认证
- 论文笔记_S2D.21_2014-CVPR_单张图像的离散-连续深度估计
- java 解析cron_Quartz 源码解析(六) —— 解析Cron表达式
- 相对论【6】广义相对论简单的几乎无关的讨论
- ora-12514TNS 监听程序当前无法识别连接描述符中请求服务的解决
- Postman接口测试工具
- RTEMS 移植到 sbc2440 的笔记
- [学习笔记]马氏链模型
- 启动nacos报错:Exception in thread main java.lang.UnsupportedClassVersionError
- 内容为王时代,你还在用畅言评论吗?
- 什么是寄存器的recovery time和removal time?
热门文章
- 在线图像识别相似图片_宋源:图像识别传感器在制桶设备上的应用(附视频)...
- 和quicklook相似的软件_细数软件推荐上万热度出现比例较高的10款软件,看看谁出现最多...
- 【Python制作小游戏】一篇文章带你做出自己的“大鱼吃小鱼”
- 个人计算机多核cpu好处,CPU是多核好还是高主频好?
- c#期末考试知识点_c#期末考试复习题及答案
- java web 分页_Java Web(十一) 分页功能的实现
- Python+OpenCV:交互式图像前景提取(Interactive Foreground Extraction using GrabCut Algorithm)
- 全自动光电整纬机安装和功能分析
- 23个Python爬虫开源项目代码
- Spring系统学习--20180613:Spring的AOP开发说明