天天看點

Jmeter請求post,背景一直擷取不到資料

一開始我用Jmeter做發post請求背景,Jmeter我是這麼寫的:

Jmeter請求post,背景一直擷取不到資料

背景我用RequestServletUtils.getStringParameter的方式來擷取傳過來的值,但是一直擷取不到,我使用了http資訊頭:Content-Type=applcation/json也沒用。 ---------------------------------------------------------------------------------------------------------------------------------------------------------

原因: 先看一個說明: 在servlet規範3.1.1節裡,對POST資料何時會被當做parameters有描述:

1. The request is an HTTP or HTTPS request.

2. The HTTP method is POST.

3. The content type is application/x-www-form-urlencoded.

4. The servlet has made an initial call of any of the getParameter family of methods on the request object.

If the conditions are met, post form data will no longer be available for reading directly from the request object’s input stream.

是以對于http post請求,tomcat伺服器隻接受application/x-www-form-urlencoded形式的請求來讀取request body中内容,并放于parameter中,而且body中的内容是key=value&key=value的形式。

假如我們要傳遞一個json内容,是沒辦法做到背景通過key來擷取json中對應的value的。 使用ajax方式,需要使用application/json的請求頭,将對象參數轉為json格式的字元串放于payload中,背景就可以直接讀取request的流,進而獲得整個json字元串 然後通過json的工具轉換擷取裡面的keyvalue。。。 注意,這裡必須要要将對象參數變為json格式的字元串再傳遞(JSON.stringify({ptime:11111})),不然背景request.getReader().readLine()讀出來是ptime=11111,根本沒法轉。是以沒有任何意義。因為jquery看到data如果是json對象,是會将json變成 參數=value&參數=value的格式的,轉成字元串再傳遞就不會改變任何東西。

使用ajax發送post,其實預設contentType是application/x-www-form-urlencoded,data裡放的是json類型對象資料,但是其實jquery在發送前就已經将這個json對象轉為 ptime=1111111的格式放在form data(request body)裡來發送了,是以背景是可以正常擷取的。  $.ajax({     url: 'http://localhost:8080/rate/api-limit',     type: 'POST',     data: {ptime:111111},     success:function(data,status){         console.log(data);     }  }); 注意:這裡的data一定要是json對象,不能将其轉為json字元串,否則傳過去會把整個字元串當做一個key,然後value是空。

假如我們想用傳遞一個json格式到背景,背景用一個實體類來映射多個字段,這個時候可以使用@RequestBody來綁定變量,變量是會映射所有參數,我們也可以使用一個map來裝載所有的參數。

之前有篇文章介紹使用patch請求,由于patch跟post一樣處理,而patch不支援application/x-www-form-urlencoded的格式,隻支援application/json,是以隻能通過将傳遞的參數轉為字元串放在payload 背景用@requestbody來綁定變量,才能擷取傳遞過來的值。

解決:是以jmeter那個問題就很簡單了,把消息頭删掉,把{ptime:11111}改成ptime=11111背景就可以擷取了。