Gatling Scala:批量读取文件记录并作为JSON请求体的技术问询
问题解答:批量读取记录并构建JSON请求体
咱们一步步来解决你的两个问题:
1. 记录文件的类型选择(后缀为records.)
最推荐你用 records.json(JSON数组格式),理由很直接:
- 你的最终需求是把记录转成JSON请求体,JSON数组天然适配多条字符串的存储,格式就是
["记录1", "记录2", "记录3", ...],后续读取和转换的成本最低。 - 如果你的记录是每行一条纯字符串的格式,也可以用
records.txt,但读取后需要额外把这些字符串包装成JSON数组,步骤会多一点。
优先选records.json,能帮你省不少转换功夫。
2. 读取X条记录并构建JSON请求体
你的示例代码里用了ElFileBody直接读取整个文件,但现在需要读取指定数量的记录,得先手动读取文件、截取X条,再转成JSON字符串作为请求体。下面分两种文件格式给你示例代码:
情况一:用records.json(JSON数组格式)
import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.core.type.TypeReference import java.io.File import org.apache.http.entity.StringBody import org.apache.http.entity.ContentType // 1. 初始化Jackson的ObjectMapper(处理JSON序列化/反序列化) val objectMapper = ObjectMapper() // 2. 读取整个JSON数组文件,转成字符串列表 val allRecords: List<String> = objectMapper.readValue( File("records.json"), object : TypeReference<List<String>>() {} ) // 3. 定义要读取的记录数X,这里假设是5 val x = 5 // 取前X条记录,如果总记录数不足X,就取所有现有记录 val selectedRecords = allRecords.take(x) // 4. 把选中的记录转成JSON数组字符串 val requestBodyJson = objectMapper.writeValueAsString(selectedRecords) // 5. 构建POST请求,把JSON字符串作为请求体传入 val request: HttpRequestBuilder = Utils.createPostBodyRequest( "request", "localhost:8080/request", mapOf(Constants.Content_Type to Constants.Application_Json), StringBody(requestBodyJson, ContentType.APPLICATION_JSON) )
情况二:用records.txt(每行一条字符串)
如果你的记录是每行存一条,就用这个方案:
import com.fasterxml.jackson.databind.ObjectMapper import java.io.File import org.apache.http.entity.StringBody import org.apache.http.entity.ContentType // 1. 读取txt文件的所有行,直接得到字符串列表 val allRecords: List<String> = File("records.txt").readLines() // 2. 截取前X条记录 val x = 5 val selectedRecords = allRecords.take(x) // 3. 转成JSON数组字符串 val objectMapper = ObjectMapper() val requestBodyJson = objectMapper.writeValueAsString(selectedRecords) // 4. 构建请求,和上面逻辑一致 val request: HttpRequestBuilder = Utils.createPostBodyRequest( "request", "localhost:8080/request", mapOf(Constants.Content_Type to Constants.Application_Json), StringBody(requestBodyJson, ContentType.APPLICATION_JSON) )
额外提示
- 如果需要分页读取(比如第一次取1-5条,第二次取6-10条),可以用
allRecords.drop(n).take(x),其中n是已经读取过的记录数。 - 记得加异常处理:比如文件不存在、JSON格式错误、X为0或者负数的情况,避免程序崩溃。比如可以加个判断:
if (x <= 0) { throw IllegalArgumentException("X必须是正整数") } if (selectedRecords.isEmpty()) { println("提示:文件中没有可用记录") }
内容的提问来源于stack exchange,提问作者Lihi Golan
相关产品推荐
相关产品推荐

