接口测试中模拟post四种请求数据

article/2025/10/2 11:29:38

转自
作者:隋胖胖LoveFat
链接:https://www.jianshu.com/p/3b6d7aa2043a
来源:简书

一、背景介绍
在日常的接口测试工作中,模拟接口请求通常有两种方法,fiddler模拟和HttpClient模拟。

Fiddler是一个简单的http协议调试代理工具,它界面友好,易于操作,是模拟http请求的利器之一。
而我们常说的HttpClient工具包,追根溯源是Apache基金的HttpComponent项目的一个组成部分。HttpComponent有三个主要组成部分,分别是HttpCore、HttpClient以及AsynchHttpClient。按照HttpComponent官网的介绍,HttpCore是底层的HTTP传输组件,用最小的内存来实现模拟客户端和服务器端的Http请求。HttpClient则是基于HttpCore实现的Http请求模拟代理, 可以用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包。Asynch HttpClient也是基于HttpCore的,顾名思义则是用于处理大量并发请求时的http代理。不同格式的数据通过这两种模拟方法的处理方式不同。

在接口测试中,接口通常是get请求或者post请求。get请求的测试一般较为简单,只需设置好相关的请求头,url写正确即可。但是在测试post请求时,请求数据格式的设置往往就稍显复杂。尤其是在开发人员的接口文档描述不清楚的情况下,会影响到测试效率。
故而本文总结了下post请求常见的四种数据格式和他们对应的fiddler、HttpClient模拟请求的构造方法。

二、post请求主体详解
一个正常的post请求主要包括请求行,请求头,请求主体,也就是
HTTP请求:

<request line> //http请求行

<headers> //http请求消息报头

<blank line> //回车换行

[<request-body>] //http请求正文

对于get请求来说没有请求主体entity-body。对于post请求而言,不会对发送请求的数据格式进行限制,理论上你可以发任意数据,但是服务器能不能处理就是另一回事了。服务器收到数据后,如何解析数据呢?它会以请求头中的Content-Type设置的内容来进行数据解析。确定好Content-Type的格式之后,请求主体的数据格式也就确定下来了。Content-Type的格式有四种:分别是application/x-www-form-urlencoded(这也是默认格式)、application/json、text/xml以及multipart/form-data格式。
这些不同的post请求数据格式要通过HttpEntity来构造,有必要简单理一下HttpClient的HttpEntity对象,因为所有的post请求数据均需要置于HttpEntity实体中进行发送。HttpEntity是一个接口,实现这个接口的具体类有很多,比较常用的是StringEntity、UrlEncodedFormEntity(继承自StringEntity)、MultipartEntity。他们将在发送不同格式的post请求时被用到。接下来就详细地介绍每一种数据格式对应的fiddler请求模拟和httpClient请求模拟(java实现)的实现情况。

三、四种Post请求数据格式和fiddler和HttpClient模拟请求构造
(一)application/x-www-form-urlencoded数据格式

在W3C官网上明确对这种数据格式进行了定义:
This is the default content type. Forms submitted with this content type must be encoded as follows:
Control names and values are escaped. Space characters are replaced by ‘+’, and then reserved characters are escaped as described in [RFC1738], section 2.2: Non-alphanumeric characters are replaced by ‘%HH’, a percent sign and two hexadecimal digits representing the ASCII code of the character. Line breaks are represented as “CR LF” pairs (i.e., ‘%0D%0A’).The control names/values are listed in the order they appear in the document. The name is separated from the value by ‘=’ and name/value pairs are separated from each other by ‘&’.

这是post请求最常见也是默认的数据提交格式。它要求数据名称(name)和数据值(value)之间以等号相连,与另一组name/value值之间用&相连。例如:parameter1=12345&parameter2=23456。将请求的内容进行格式化了,其实这个方法同时简化的客户端发送,也简化了服务器端获取,服务器通过getParameters(String name)即可获取到传送来的信息。
我们看下如何分别用fiddler和HttpClient的话模拟post请求。
(1)如果用fiddler模拟请求的话,请求头和请求主体的内容可以这样构造:
在这里插入图片描述
模拟请求之后,从返回结果可以查看到我们的请求数据:
在这里插入图片描述

(2)如果用HttpClient模拟post请求的话,请求可以这样构造:

DefaultHttpClient client = new DefaultHttpClient();
List<BasicNameValuePair> params = new ArrayList<BasicNameValuePair>();     //定义键值对列表,用于存放向url发送post请求的数据。        
params.add(new BasicNameValuePair("parameter1", "12345"));        
params.add(new BasicNameValuePair("parameter2", "23456"));               //向params设置数据        
HttpPost post = new HttpPost("http://example.com");                      //定义HttpPost对象并初始化它    
HttpEntity reqEntity = new UrlEncodedFormEntity(params);                 //用UrlEncodedFormEntity对象包装请求体数据                                                   
post.setEntity(reqEntity);                                               //设置post请求实体        
HttpResponse response = client.execute(post);                            //发送http请求        
System.out.println("the request body is:"+EntityUtils.toString(reqEntity));          //打印出请求实体        
System.out.println(response.getStatusLine().getStatusCode());                         //打印http请求返回码

**(二)application/json数据格式 **
application/json格式的请求头是指用来告诉服务端post过去的消息主体是序列化后的 JSON 字符串。
(1)如果用fiddler模拟请求的话,请求头和请求主体的内容可以这样构造:
在这里插入图片描述
模拟请求之后,从返回结果可以看到我们的请求数据:

在这里插入图片描述
(2)如果用HttpClient模拟post请求的话,请求可以这样构造:

HttpClient client = new DefaultHttpClient();   JSONObject js = new JSONObject();                                  //定义一个JSON数据格式对象,用其保存请求主体数据。js.element("parameter1", "12345");                                 //为JSON对象的各个key值赋值js.element("parameter2","23456");String postRequest = js.toString();HttpPost post = new HttpPost("http://example.com");                 //定义HttpPost对象并初始化它    StringEntity reqEntity = new StringEntity(js.toString());           //用StringEntity对象包装请求体数据 reqEntity.setContentType("application/json");                       //设置请求头数据传输格式 post.setEntity(reqEntity);                                          //设置post请求实体 HttpResponse response = client.execute(post);                       //发送http请求System.out.println("the request body is:"+EntityUtils.toString(reqEntity));            //打印出请求实体System.out.println(response.getStatusLine().getStatusCode());                          //打印http请求返回码

这里我们可以发现HttpClient模拟post请求时,请求头格式为application/x-www-form-urlencoded与application/json的主要差别在于请求主体的构造格式(前者是键值对,后者是JSON串)以及包装请求体数据用的方法不同(前者是UrlEncodedFormEntity,后者是StringEntity)。
** (三)text/xml数据格式 **
(1)如果用fiddler模拟请求的话,请求头和请求主体的内容可以这样构造:
在这里插入图片描述

模拟请求之后,从返回结果可以看到我们的请求数据:
在这里插入图片描述
(2)如果用HttpClient模拟post请求的话,请求可以这样构造:

Document doc = DocumentHelper.createDocument();                           //创建document对象
Element book = doc.addElement("book");                                    //构建document对象各个节点
book.addElement("title").addText("芈月传");
book.addElement("author").addText("蒋胜男");
String body = book.asXML();                                               //Document对象转成string类型
StringEntity reqEntity = new StringEntity(body);                          //用StringEntity对象包装请求体数据
reqEntity.setContentType("text/xml");                                     //设置请求头数据传输格式
reqEntity.setContentEncoding("utf-8");                                    //设置请求头数据编码格式
HttpPost post = new HttpPost("http://example.com");                       //定义HttpPost对象并初始化它   
post.setEntity(reqEntity);                                                //设置post请求实体
HttpResponse response = client.execute(post);                             //发送http请求
System.out.println("the request body is:"+EntityUtils.toString(reqEntity));   //打印出请求实体
System.out.println(response.getStatusLine().getStatusCode());                 //打印http请求返回码

(四)multipart/form-data数据格式
除了传统的application/x-www-form-urlencoded表单,我们另一个经常用到的是上传文件用的表单,这种表单的类型为multipart/form-data。在HttpClient程序扩展包(HttpMime)中专门有一个类与之对应,那就是MultipartEntity类。此类同样实现了HttpEntity接口。
(1)如果用fiddler模拟请求的话,请求头和请求主体的内容可以这样构造:
第一步,先设置好请求头格式,然后点击upload file…
在这里插入图片描述

第二步,上传你的文件,这里我上传一个png的图片
在这里插入图片描述
这是fiddler根据我们上传的文件自动调整生成的请求,在请求头中看到,我们需要选择一段数据作为“分割边界”(boundary属性),这个“边界数据”不能在内容其他地方出现,一般来说使用一段从概率上说“几乎不可能”的数据即可。每次post浏览器都会生成一个随机的30-40位长度的随机字符串,浏览器一般不会遍历这次post的所有数据找到一个不可能出现在数据中的字符串,一般都是随机生成。选择了这个边界之后,浏览器便把它放在Content-Type 里面传递给服务器,服务器根据此边界解析数据。下面的数据便根据boundary划分段,每一段便是一项数据。(每个field被分成小部分,而且包含一个value是"form-data"的"Content-Disposition"的头部;一个"name"属性对应field的ID等等,文件的话包括一个filename)
模拟请求之后,从返回结果可以看到我们的请求数据:
在这里插入图片描述
(2)如果用HttpClient模拟post请求的话,请求可以这样构造:

HttpPost post = new HttpPost("http://example.com");           //定义HttpPost对象并初始化它
MultipartEntity mutiEntity = new MultipartEntity();           //定义MultipartEntity对象
File file = new File("C:\Users\hzsuixiang\Desktop\image_20151117151539.png");
mutiEntity.addPart("desc",new StringBody("网易云阅读", Charset.forName("utf-8")));     //设置multiEntity对象的主体数据
mutiEntity.addPart("pic", newFileBody(file));post.setEntity(mutiEntity);             //设置post请求主体
HttpResponse  httpResponse = client.execute(post);                                   //执行post请求
HttpEntity httpEntity =  httpResponse.getEntity();                                   //获得响应返回实体

综上,就是接口测试中fiddler与HttpClient模拟post接口四种请求数据的构造方法,总结起来有利于在以后的接口测试工组过程中可以及时查阅。另外,为了尽可能简化核心代码,列出的这些代码中并没有写出需要的jar包,大家使用的时候需要自行添加。

转自
作者:隋胖胖LoveFat
链接:https://www.jianshu.com/p/3b6d7aa2043a
来源:简书


http://chatgpt.dhexx.cn/article/e48mYUyf.shtml

相关文章

谷歌学术访问

https://via.hypothes.is/ 不需要镜像&#xff0c;不需要任何操作&#xff0c;只需打开这个网站&#xff0c;输入你要访问的学术网站&#xff0c;秒开 第一步&#xff1a; 第二步:

谷歌学术(google scholar)个人主页的论文信息不准确怎么办?

题目&#xff1a;谷歌学术(google scholar)个人主页的论文信息不准确怎么办&#xff1f; 谷歌学术主页是很多人展示自己学术成果的一种方式&#xff0c;但很多时候&#xff0c;谷歌自动给你聚集到主页的论文信息是有误的&#xff0c;这时候怎么去编辑呢&#xff1f; 论文信息…

谷歌学术介绍

转载自&#xff1a;http://blog.renren.com/share/111541487/15517062888 “谷歌学术”是谷歌搜索引擎中的学术检索部分&#xff0c;相对于知网、维普、万方、Pubmed等专业的论文数据库来说功能单薄了些&#xff0c;但具有页面简约、搜索速度快、集国内外文献于一体、某些文章可…

Google 学术搜索(Google Scholar)使用技巧

本文简介Google 学术搜索&#xff08;Google Scholar&#xff09;使用技巧&#xff0c; 关于Web Of Science 上搜索文献&#xff0c;查看SCI分区及影响因子情况参见我的另一篇博客&#xff08;https://xiongyiming.blog.csdn.net/article/details/78474211&#xff09; Google…

【谷歌学术】使用指南

【谷歌学术】使用指南 谷歌可以清楚看到作者的影响力&#xff0c;尤其是在衡量一个学者有多厉害&#xff0c;论文质量有多高【往往是博士阶层往上】 谷歌学术网站&#xff1a; https://scholar.google.com.hk/?hlzh-CN 查人 查论文都很好用 同时你订阅这个作者 还会收到他…

如何在谷歌学术下载论文

如何在谷歌学术下载论文&#xff08;在Mac Pro上记录&#xff0c;但是windows应该同样适用&#xff09; 1 下载谷歌浏览器 下载谷歌浏览器 官网截图如下&#xff1a; 2 下载谷歌浏览器扩展程序 googlehelper下载 在下载的时候&#xff0c;要记住下载的位置&#xff0c;后面…

谷歌学术搜索

Google Scholar &#xff08;谷歌学术搜索&#xff0c;简称GS&#xff09;是一个可以免费搜索学术文章的网络搜索引擎索引了出版文章中文字的格式和科目&#xff0c;能够帮助用户查找包括期刊论文、学位论文、书籍、预印本、文摘和技术报告在内的学术文献&#xff0c;内容涵盖自…

谷歌学术Google Scholar超实用干货(拒绝翻墙/插件)

最近看了很多大佬博主发的谷歌学术使用总结,觉得特别有用,小P在这里简单的总结一下,给自己做个使用大纲,也分享给大家啦!(觉得有帮助别忘了点赞、收藏哦) 谷歌学术简单来说就是一个汇集大量外文文献的网站(类似于百度学术)。百度学术的特点是:精简、不全不新,谷歌学…

科研——谷歌学术使用方法

输入需要搜索的文章名 点击“引用”&#xff0c;即可以出此篇文章的引用格式。点击“被引用次数”&#xff0c;即可以看到引用此篇文章的其他文章。 勾选“在引用文章中搜索”&#xff0c;在上方的空白处&#xff0c;搜索这些引用文章中的具体文章。 点击一篇查看是否被真正引用…

谷歌学术——下载论文

一些同学在找论文的时候&#xff0c;在学校数据库找不到&#xff0c;因此可以使用谷歌学术来找。但是国内被墙了&#xff0c;无法访问&#xff0c;所以可以使用镜像服务器。 首先进入谷歌镜像&#xff1a; 镜像网站&#xff08;https://ac.scmor.com/&#xff09; 点击进入之后…

国内外常用学术网站(访问不了“谷歌学术”的,试一试有惊喜哦)

搞学术的可能对如何能够快速查找优质免费学术资源感到头大于是笔者寻找了许许多多方法&#xff0c;搜集了很多网站&#xff0c;期望谷歌访问不了是可以找到替代或者与谷歌学术相媲美的网站&#xff0c;现汇总如下分享给大家&#xff0c;希望对搞研究的有所帮助。 一、学术网站…

RPC框架介绍

什么是RPC框架&#xff1a; 远程过程调用RPC&#xff0c;就是客户端基于某种传输协议通过网络向服务提供端请求服务处理&#xff0c;然后获取返回数据(对于ONE WAY模式则不返还响应结果)&#xff1b;而这种调用对于客户端而言&#xff0c;和调用本地服务一样方便&#xff0c;开…

跨语言rpc框架Thrift

RPC 全称 Remote Procedure Call——远程过程调用。RPC技术简单说就是为了解决远程调用服务 的一种技术&#xff0c;使得调用者像调用本地服务一样方便透明 Thrift的定义 Thrift是一个轻量级、跨语言的RPC框架&#xff0c;主要用于各个服务之间的RPC通信&#xff0c;最初由Face…

RPC 框架性能大比拼

Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。 Motan 是新浪微博开源的一个Java 框架。它诞生的比较晚,起于2013年,2016年5月开源。Motan 在微博平台中已经广泛应用,每天为数…

分布式RPC框架性能大比拼

点击上方“后端技术精选”&#xff0c;选择“置顶公众号” 技术文章第一时间送达&#xff01; 来源&#xff1a;鸟窝 链接&#xff1a;http://985.so/aXe2 推荐阅读(点击即可跳转阅读) 1. SpringBoot内容聚合 2. 面试题内容聚合 3. 设计模式内容聚合 4. 排序算法内容聚合 5. 多…

C++微服务RPC框架,一文带你彻底搞懂 RPC

RPC&#xff08;Remote Procedure Call&#xff09;&#xff0c;是一个大家既熟悉又陌生的词&#xff0c;只要涉及到通信&#xff0c;必然需要某种网络协议。我们很可能用过HTTP&#xff0c;那么RPC又和HTTP有什么区别呢&#xff1f;RPC还有什么特点&#xff0c;常见的选型有哪…

手动实现一个RPC框架 (一):RPC的介绍

手动实现RPC框架 最近在备战22年暑假实习的招聘&#xff0c;由于之前也没有实习的经验&#xff0c;所以在项目经验这方面也比较缺乏。在跟着B站尚硅谷的课程学习完微服务和分布式组件的内容后又跟着写了尚医通的微服务实战项目。尚医通项目中有使用到OpenFeign和FeignClient来远…

[转]php中流行的rpc框架有哪些?

什么是rpc框架 先回答第一个问题&#xff1a;什么是RPC框架&#xff1f; 如果用一句话概括RPC就是&#xff1a;远程调用框架&#xff08;Remote Procedure Call&#xff09; 那什么是远程调用&#xff1f; 通常我们调用一个php中的方法&#xff0c;比如这样一个函数方法: loc…

中间件 rpc是什么?php中流行的中间件rpc框架有哪些

rpc是什么&#xff1f;php中流行的rpc框架有哪些。 更好的排版&#xff1a;https://www.zybuluo.com/phper/note/76641 什么是rpc框架 先回答第一个问题&#xff1a;什么是RPC框架&#xff1f; 如果用一句话概括RPC就是&#xff1a;远程调用框架&#xff08;Remote Procedure C…

rpc是什么?php中流行的rpc框架有哪些?

什么是rpc框架 先回答第一个问题&#xff1a;什么是RPC框架&#xff1f;如果用一句话概括RPC就是&#xff1a;远程调用框架&#xff08;Remote Procedure Call&#xff09; 那什么是远程调用&#xff1f; 通常我们调用一个php中的方法&#xff0c;比如这样一个函数方法: localA…