【问题标题】:Multipart - How to test api of uploading a file and json data in jmeterMultipart - 如何在jmeter中测试上传文件和json数据的api
【发布时间】:2018-08-16 03:13:16
【问题描述】:

我在 Jmeter 中上传文件(例如 Upload.txt)和 JSON 数据时遇到困难。

HTTP Header Manager

查看结果树中的请求

POST http://localhost:8080/xxxx/custom/uploaddocument

POST data:
--jmeter_is_great
Content-Type: application/json; charset=UTF-8
{
	"Document": {
		"documentName": "TEST.txt",
		"fullPath": "Test",
		"priority": "M",
		"referenceNo": "Ref12345",
		"descrption": "Testfile",
		"userDef1": "",
		"userDef2": "",
		"userDef3": "",
		"userDef4": "",
		"userDef5": "",
		"userDef6": "",
		"userDef7": "",
		"userDef8": "",
		"userDef9": "",
		"userDef10": "",
		"profile": {
			"id": -2,
			"index": [{
				"id": -7,
				"value": "Signature",
				"type": "D"
			}]
		},
		"ACL": {
			"isInherit": false,
			"permission": [{
				"permissionType": "U",
				"userID": 10001,
				"groupID": "",
				"roleID": "",
				"permissionString": "ROPKFIAENTCMDHZVWGLUSB",
				"mustFlag": false
			}]
		}
	}
}

--jmeter_is_great
Content-Type: text-plain

THIS IS TESTING FILE CONTENT

--jmeter_is_great--


[no cookies]

Request Headers:
Connection: keep-alive
Content-Length: 876
Content-Type: multipart/related; boundary=jmeter_is_great

响应数据

HTTP 状态 415 - 不支持的媒体类型

其实Document里面有一部分JSON如下:

    "content": {
   "binary": [80, 97, 114, 97, 68, 77, 32, 84, 69, 83, 84, 32, 102, 105, 108, 101]
}

我已尝试如下请求标头,然后将带有“内容”的整个 JSON 发送到 api:

[HTTP 标头] 授权:YXBpYWRtaW46cGFzc3dvcmQ= 内容类型:application/json

但是,也会抛出 HTTP 415 响应错误。

我读过一些有类似问题的文章: Testing REST API File Uploads in JMeter

期待任何见解!

【问题讨论】:

    标签: jmeter multipart stress-testing


    【解决方案1】:
    1. 您的 Authorization 标头似乎格式错误,也就是说:

      • 应该以大写开头A
      • 我的期望是它应该看起来像Basic YXBpYWRtaW46cGFzc3dvcmQ=

      请注意绕过basic HTTP authentication in JMeter 的更好方法是使用HTTP Authorization Manager 配置如下:

      • 基本网址:http://localhost:8080/xxxx/
      • 用户名:apiadmin
      • 密码:password
    2. 您的Content-Type 标头也不正确,您使用了错误的boundary,即在HTTP 标头管理器中您有andytest,而在请求正文中有jmeter_is_great,它们必须匹配。

    3. 假设超过 2 点,我想我应该警告您,当您手动构建请求时,任何违反协议标准的行为(甚至额外或缺少空行或小写字符)都会破坏您的请求

    4. 所引用的文章假设使用 Google Drive API 进行演示,您的应用程序可能会以不同的方式工作,因此您可能必须重新考虑整个方法。尝试使用HTTP(S) Test Script Recorder 记录您的文件上传(确保将TEST.txt 文件复制到JMeter 的“bin”文件夹),以查看生成的请求看起来如何,因为您可能会走错方向。

    5. 不要在同一台物理(或虚拟)机器上运行 JMeter 和被测系统,因为它们会为 CPU 和 RAM 等资源而苦苦挣扎,因此您将无法获得准确可靠的结果。

    【讨论】:

    • 1) 授权的标头是正确的,因为我测试了另一个具有相同标头配置的api(WS02-Create文件夹)并且请求成功处理。我同意添加 HTTP 授权管理器是绕过 HTTP 身份验证的更好方法。我将在后续测试中进行。 2) 我上传了错误的 HTTP 请求标头图像。是的。边界应该是 jmeter_is_great
    【解决方案2】:

    我终于找到了解决方案,希望答案可以帮助任何面临类似问题的人。

    首先,“HTTP Status 415 - Unsupported Media Type”,如果抛出此错误,则很有可能是不正确的Content-Type。

    所以,我的做法是尝试HTTP Request Header的所有可能的Content-Type,我发现当Content-Type设置为multipart/form-data时,错误码从415变成了500 .

    然后,我从https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-2#file-upload 中有关文件上传的有用链接中有所了解

    我将请求正文更改如下:

    --boundary
    Content-Disposition: form-data; name="documentJsonStr"
    Content-Type: text/plain; charset=UTF-8
    
    ${myvar2}
    
    --boundary
    Content-Disposition: form-data; name="data"; filename="100MB.txt"
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: base64
    
    ${__FileToString(100MB.txt,,)}
    
    --boundary--

    ${myvar2} 由 BeanShell PreProcessor 设置,其中包含字符串格式的 Json 请求。但是,根据 api 接受的参数类型,它可能不是完全相同的配置。

    希望这是有用的。

    【讨论】:

      猜你喜欢
      • 2021-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      相关资源
      最近更新 更多