使用Cucumber BDD框架调用文件上传API遇500错误,表单参数异常
以下是针对你的Cucumber BDD+RestAssured文件上传请求返回500错误的具体修改建议:
移除重复的Content-Type设置
代码中同时通过addHeader("Content-Type","multipart/form-data")和setContentType(ContentType.MULTIPART)设置请求头,会导致请求头重复,引发服务器解析异常。直接删除addHeader("Content-Type","multipart/form-data")这一行即可,setContentType(ContentType.MULTIPART)会自动生成正确的multipart请求头。匹配表单参数的类型要求
检查API文档中Size、Length、Priority等数值型参数的接收格式,部分API要求这类参数以字符串形式传递。尝试将数字参数改为字符串类型:addFormParam("Size","11"). addFormParam("Length","1"). addFormParam("Priority","2"). addFormParam("ClientId","18"). addFormParam("SubClientId","19").校验文件路径与存在性
确认D:\\APItestdocument.docx文件确实存在,路径无拼写错误。可以添加文件存在性校验,避免因文件不存在导致的请求异常:File uploadFile = new File("D:\\APItestdocument.docx"); if(!uploadFile.exists()){ throw new IOException("上传文件不存在:" + uploadFile.getAbsolutePath()); } addMultiPart("file", uploadFile)排查请求日志细节
查看logging.txt中的完整请求内容,确认表单参数是否正确封装到multipart请求中,是否存在参数缺失或格式错误。必要时可以临时添加控制台日志输出,方便实时查看请求详情。避免RequestSpecification复用污染
当前代码中全局变量req初始化后会复用,多次执行测试可能携带旧状态。建议每次调用file_upload()时重新构建RequestSpecification,去掉全局变量的判断逻辑:public RequestSpecification file_upload() throws IOException { PrintStream log = new PrintStream(new FileOutputStream("logging.txt")); File uploadFile = new File("D:\\APItestdocument.docx"); if(!uploadFile.exists()){ throw new IOException("上传文件不存在:" + uploadFile.getAbsolutePath()); } return new RequestSpecBuilder() .setBaseUri(getGlobalValue("BaseUrl")) .setContentType(ContentType.MULTIPART) .addFormParam("Name","Annu") .addFormParam("Size","11") .addFormParam("Length","1") .addFormParam("Type","docx") .addFormParam("Priority","2") .addFormParam("ClientId","18") .addFormParam("SubClientId","19") .addFormParam("Comment","no Comments") .addMultiPart("file", uploadFile) .addFilter(RequestLoggingFilter.logRequestTo(log)) .addFilter(ResponseLoggingFilter.logResponseTo(log)) .build(); }
内容的提问来源于stack exchange,提问作者Anvesh Gummadidala

