You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WireMock Stub:Curl转JSON生成及文件状态校验需求

WireMock Stub 实现指南

核心需求:匹配PUT上传请求的基础Stub

创建映射文件put-upload-file.json放入WireMock的mappings目录,匹配目标PUT请求的路径、请求头及multipart表单:

{
  "request": {
    "method": "PUT",
    "url": "/upload/file",
    "headers": {
      "accept": { "equalTo": "application/json" },
      "authorization": { "equalTo": "sso-auth" },
      "Content-Type": { "contains": "multipart/form-data" }
    },
    "multipartPatterns": [
      {
        "name": { "equalTo": "job_file" },
        "contentType": { "equalTo": "text/plain" },
        "matchingType": "ANY"
      }
    ]
  },
  "response": {
    "status": 200,
    "headers": { "Content-Type": "application/json" },
    "jsonBody": {
      "status": "success",
      "message": "File uploaded successfully"
    },
    "transformers": ["file-upload-state-transformer"]
  }
}

次要需求:文件校验与状态管理

要实现提取文件名、校验本地文件存在性并支持后续状态查询,需要结合WireMock自定义扩展与状态存储:

1. 自定义响应转换器(提取文件名+校验本地文件)

创建Java类FileUploadStateTransformer,解析multipart请求获取文件名,校验指定本地路径下的文件是否存在,并将结果存入WireMock全局状态:

import com.github.tomakehurst.wiremock.client.WireMock;
import com.github.tomakehurst.wiremock.common.FileSource;
import com.github.tomakehurst.wiremock.extension.Parameters;
import com.github.tomakehurst.wiremock.extension.ResponseTransformer;
import com.github.tomakehurst.wiremock.http.Request;
import com.github.tomakehurst.wiremock.http.Response;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.File;
import java.util.List;

public class FileUploadStateTransformer extends ResponseTransformer {

    @Override
    public Response transform(Request request, Response response, FileSource files, Parameters parameters) {
        HttpServletRequest servletRequest = new HttpServletRequestWrapper(request.getHttpServletRequest());
        if (ServletFileUpload.isMultipartContent(servletRequest)) {
            try {
                List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(servletRequest);
                for (FileItem item : items) {
                    if (item.isFormField()) continue;
                    String fileName = item.getName();
                    // 替换为你的本地校验路径
                    File localFile = new File("/your/local/check/path/" + fileName);
                    // 将文件存在状态存入全局状态
                    WireMock.getGlobalSettings().getState().put("uploaded_file_" + fileName, localFile.exists());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return response;
    }

    @Override
    public String getName() {
        return "file-upload-state-transformer";
    }
}

2. 状态查询Stub

创建映射文件get-file-status.json,允许通过文件名查询之前存储的状态:

{
  "request": {
    "method": "GET",
    "urlPattern": "/file/status/([a-zA-Z0-9_\\.]+)"
  },
  "response": {
    "status": 200,
    "headers": { "Content-Type": "application/json" },
    "jsonBody": {
      "file_name": "${request.pathSegments.[2]}",
      "exists": "${state.uploaded_file_${request.pathSegments.[2]}}"
    },
    "transformers": ["response-template"]
  }
}

3. 启动WireMock并加载扩展

编译自定义转换器后,启动WireMock时指定扩展与模板支持:

java -jar wiremock-jre8-standalone.jar --extensions com.your.package.FileUploadStateTransformer --global-response-templates

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 18:31:31