Клиент SpringBoot WebService: параметры MultipartFile и String - PullRequest
0 голосов
/ 29 июня 2018

Я реализовал веб-сервис REST для загрузки с использованием SpringBoot, который получает 2 параметра:

  • Строковое сообщение
  • Файл

Код веб-службы выглядит следующим образом:

@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);

Я хотел бы узнать, есть ли способ создать bodyPart для объекта MultiPart, чтобы создать параметр String и MultipartFile. Если это не так, как я могу выполнить запрос к WS?

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Кстати, такого же поведения можно добиться, используя 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();
0 голосов
/ 29 июня 2018

В итоге мне удалось заставить его работать следующим образом:

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()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...