java 在Rest Assured中发布多部分文件和JSON

0kjbasz6  于 2023-10-14  发布在  Java
关注(0)|答案(3)|浏览(140)

我需要发送一个视频文件和JSON对象在休息放心后调用。
结构如下:
{“sample”:{
“name”:“sample-name”,
“kind”:“上传”,
“video_file”:多部分文件在此
所以我喜欢下面的
代码:

  1. given()
  2. .header("Accept", "application/json")
  3. .header(auth)
  4. .config(rConfig)
  5. .body(body)
  6. .multiPart("sample[video_file]", new File("path"), "video/mp4")
  7. .formParam("sample[name]", "Video Upload")
  8. .formParam("sample[kind]", "upload")
  9. .log().all().
  10. expect()
  11. .statusCode(expectedStatusCode)
  12. .post(url);

在Rest Assured中使用multipart时,我无法使用application/JSON。我显式地将值硬编码为形式param并以multipart发送媒体文件,现在它工作正常。
如何在一个内部对象中发送所有表单参数数据。

ukdjmx9f

ukdjmx9f1#

你的方法不标准。
你不能有一个多部分的请求和一个JSON体,你需要在两种方法中选择一种:multipart/form-dataapplication/json请求。
标准的方法是使用multipart/form-data,在这种情况下,您将拥有一个包含序列化JSON负载的 json 参数的multipart请求,以及一个包含multipart文件的 file 参数。

  1. given()
  2. .contentType(MediaType.MULTIPART_FORM_DATA_VALUE)
  3. .multiPart(file)
  4. .param("json", "{\"sample\":{\"name\":\"sample- name\",\"kind\":\"upload\",\"video_file\":<this is not needed>}}")

但这涉及到更改服务器端逻辑。
如果您无法更改服务器端逻辑,并且希望使用application/json方法,则需要将文件序列化(作为字节数组或base64字符串)以在JSON负载中设置为 video_file

v440hwme

v440hwme2#

您可以使用RequestSpecBuilder来执行此操作。它支持所有的请求参数,您可以轻松地创建多部分请求。
示例代码取自https://github.com/rest-assured/rest-assured/wiki/Usage

  1. RequestSpecBuilder builder = new RequestSpecBuilder();
  2. builder.addParam("parameter1", "parameterValue");
  3. builder.addHeader("header1", "headerValue");
  4. RequestSpecification requestSpec = builder.build();
  5. given().
  6. spec(requestSpec).
  7. param("parameter2", "paramValue").
  8. when().
  9. get("/something").
  10. then().
  11. body("x.y.z", equalTo("something"));
t2a7ltrp

t2a7ltrp3#

感谢您的回复rohit.我是为了用formParams处理内部对象而发布这个问题的。我已经为formParams创建了一个哈希Map。因为formParams的方法放心可以接受Hash map。

表单参数Map创建:

  1. private static Map<String, String> createFormParamsMap(VideoTagInput videoTag) {
  2. Map<String, String> formParams = new HashMap<>();
  3. formParams.put(createFormParamKey("name"), "name");
  4. formParams.put(createFormParamKey("kind"), "kind");
  5. return formParams;
  6. }
  7. private static String createFormParamKey(String paramKey) {
  8. return "sample[" + paramKey + "]";
  9. // output is like "sample[name]" - I'm forming inner object here for my purpose.
  10. }

最后将Map发送到Rest Assured post call函数

  1. given()
  2. .header("Accept", "application/json")
  3. .header(auth)
  4. .config(rConfig)
  5. .multiPart("sample[video_file]", new File("path"), "video/mp4")
  6. .formParams(requestParamsMap) // requestParamsMap here.
  7. .log().all().
  8. expect()
  9. .statusCode(expectedStatusCode)
  10. .post(url);
展开查看全部

相关问题