Jmeter无法通过POST方法发送JSON数据

64

我正在尝试在JMeter中使用JSON数据作为请求体进行POST操作,但是收到了400错误响应。我发送请求的URL只接受JSON数据。我在Postman中使用相同的Curl命令时可以正常工作。我已经尝试将JSON数据作为参数值放入参数中,但是没有成功。

1

我只是想发送{"uid":"jmtest","name":"newdevice"}。

很抱歉我不能发布更多链接。

sampler结果为:

Thread Name: QA test 1-1
Sample Start: 2016-05-11 11:50:19 MDT
Load time: 86
Connect Time: 51
Latency: 86
Size in bytes: 282
Headers size in bytes: 244
Body size in bytes: 38
Sample Count: 1
Error Count: 1
Data type ("text"|"bin"|""): text
Response code: 400
Response message: Bad Request
Response headers:
HTTP/1.1 400 Bad Request
Server: nginx
Date: Wed, 11 May 2016 17:50:19 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 38
Connection: keep-alive
X-Request-Id: 88339ee9-b74f-4e22-b581-e3124949d067
X-Runtime: 0.030877
HTTPSampleResult fields:
ContentType: application/json; charset=utf-8
DataEncoding: utf-8

请求看起来像这样

/url redacted
POST data:
{"devices":{"uid":"jmtest","name":"newdevice"}
[no cookies]
Request Headers:
Connection: keep-alive
Accept: application/vnd.moneydesktop.v2+json
Content_Type: application/json
MD-SESSION-TOKEN: redacted
Content-Type: application/x-www-form-urlencoded
Content-Length: 46
Host: redacted
User-Agent: Apache-HttpClient/4.5.2 (Java/1.8.0_72)

响应数据是

{
:   "status":"400",
:   "error":"Bad Request"
}

我将Content-Type设置为application/json。我尝试将其放在正文数据中,但那也没有起作用。 - Justin Thompson
17个回答

122

要通过HTTP POST请求将JSON数据放入主体中,需要添加以下内容:

  • 将HTTP Header Manager添加到您的请求中,并将名称设置为“content-type”,值设置为“application/json”,这将附加到HTTP请求标头中。无论请求正文内的数据如何,都会以json格式发送。

图1:设置HTTP Header Manager, enter image description here

图2:设置HTTP请求正文数据 enter image description here


20
  1. 确保您的HTTP头管理器已配置为使用值为application/jsonContent-Type标头发送请求。
  2. 如果您有“主页”和“登录”等采样器,则可能缺少HTTP Cookie管理器
  3. 查看Postman(或其他工具)和JMeter发送的请求并捕获其差异,是找出问题最直接的方法。可以使用如Wireshark这样的嗅探工具,并相应地进行JMeter配置。
  4. 最后,看起来您正在使用一些开发人员快照,因此将JSON负载作为无名称的第一个参数的方法可能行不通。尝试切换到“Body Data”。
  5. 如果以上步骤无法解决问题,请在问题描述中附上View Results Tree监听器(所有3个选项卡)和Postman的截图。

更多技巧请参阅使用JMeter测试SOAP/REST Web服务


14

10

我曾经遇到过同样的问题,解决方法是在http请求中将内容编码值设置为utf-8。请尝试一下。


内容编码转为 utf-8 对我有用!谢谢! - ADV-IT

6

首先,您可能希望将有效负载放置在“Body Data”中,而不是“Parameters”中。

然后,添加一个配置元素"HTTP Header Manager", 并添加一个参数“content-type”,相应的值为“application/json”。

现在点击。就这样!


2
如果上述解决方案对您都不起作用(就像我一样),那么请再仔细查看HTTP Header Manager。我在那里有一个空的头行,enter image description here。将其删除即可解决问题。

1
尽管 Hasiya 解释得很好,但错过了如何查找 HTTP 请求的方法。 如果选择 HTTP 默认选项,则看不到方法选项。

enter image description here


1

我找到了问题所在。我设置了Content_type而不是Content-Type,因此它创建了两个内容类型标头。


1
我收到了HTTP/1.1 415不支持的媒体类型错误提示。
在删除HTTP Header Manager前面的空格后,它变成了200,并且像魔法一样正常工作。在此输入图片描述

1
我曾经遇到过类似的问题,我的请求体大小也很大,所以除了将内容类型更新为application/json之外,我还将内容编码设置为utf-8,这样就完美解决了。 在此输入图片描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接