SpringBoot WebService客户端:MultipartFile和String参数

时间:2018-06-29 18:56:27

标签: java web-services spring-boot jersey

我已经使用SpringBoot实现了一个上传REST Web服务,该服务接收2个参数:

  • 字符串消息
  • 文件

Web服务代码如下:

@RequestMapping(value = "/uploadtest", consumes = { MediaType.MULTIPART_FORM_DATA}, method = RequestMethod.POST)
public ResponseEntity<Map<String, String>> upload(
                                                  @RequestParam("msg") String  msg,
                                                  @RequestParam("file") MultipartFile file) {

    System.out.println("uploadtest");
    return new ResponseEntity<>(singletonMap("url", "uploadtest"), HttpStatus.CREATED);

}

我正在尝试创建Jersey WS客户端。当WS仅接收MultipartFile参数时,以下代码可以正常工作:

Client client = ClientBuilder.newBuilder()
            .register(MultiPartFeature.class).build();
    WebTarget webTarget
            = client.target("http://localhost:8080/uploadtest");

    MultiPart multiPart = new MultiPart();
    multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);

    FileDataBodyPart fileDataBodyPart = new FileDataBodyPart("file",
            new File("/filename.xml"),
            MediaType.APPLICATION_OCTET_STREAM_TYPE);
    multiPart.bodyPart(fileDataBodyPart);

    Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE)
            .post(Entity.entity(multiPart, multiPart.getMediaType()));

此外,如果两个参数均为String,则以下代码也适用:

Client client = ClientBuilder.newClient(clientConfig);
    WebTarget webTarget
            = client.target("http://localhost:8080/uploadtest");

    MultivaluedMap<String, String> formData = new MultivaluedHashMap<String, String>();
    formData.add("msg", "msg1");
    formData.add("mesgbis", "msg2");

    String responseResult = webTarget.request()
            .post(Entity.entity(formData, MediaType.MULTIPART_FORM_DATA), String.class);

我想了解是否有一种方法可以在MultiPart对象上创建bodyPart以便创建String和MultipartFile参数。如果不是这样,我该如何完成对WS的请求?

2 个答案:

答案 0 :(得分:1)

最后,我设法使其工作如下:

Client client = ClientBuilder.newBuilder()
            .register(MultiPartFeature.class).build();
    WebTarget webTarget
            = client.target("http://localhost:8080/uploadtest");

    MultiPart multiPart = new MultiPart();
    multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);

    FileDataBodyPart fileDataBodyPart = new FileDataBodyPart("file",
            new File("/filename.xml"),
            MediaType.APPLICATION_OCTET_STREAM_TYPE);

    FormDataBodyPart bodyPartMsg = new FormDataBodyPart("msg", "custom msg");
    multiPart.bodyPart(bodyPartMsg);
    multiPart.bodyPart(fileDataBodyPart);

    Response response = webTarget.request(MediaType.APPLICATION_JSON_TYPE)
            .post(Entity.entity(multiPart, multiPart.getMediaType()));

答案 1 :(得分:0)

通过使用OkHttp,可以实现相同的行为:

File uploadFile = new File(pathUploadFile);
RequestBody formBody = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("msg", job.toString())
            .addFormDataPart("mesgbis", uploadFile.getName(), RequestBody.create(null, uploadFile))
            .build();

Request request = new Request.Builder()
            .url(url)
            .post(formBody)
            .build();

String retValue = "";
Response response = client.newCall(request).execute();