Scala MultipartEntityBuilder неправильно создает границу для точки отдыха Spring - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть тело запроса, состоящее из более чем одной части тела, и ниже показано, как я обрабатываю его в scala, используя библиотеку multipartentitybuilder в scala.

val data = MultipartEntityBuilder.create() .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) .addPart("actual Header", new StringBody(actualHeader,ContentType.APPLICATION_JSON)) .addBinaryBody("payload", requestBody) .build()

для контекста, двоичное тело - это байт [] события avro, который необходимо отправить в этот пост-запрос.

При попытке отправить эту сущность в конечную точку упругой пружины через httpPost я получаю следующее исключение в ответ.

org.springframework.web.multipart.MultipartException: не удалось проанализировать многочастный запрос сервлета; вложенное исключение: java .io.IOException: org. apache .tomcat.util.http.fileupload.FileUploadException: запрос был отклонен, так как не было найдено многочастной границы

Что Я попытался:

  • Я пытался вручную добавить границу с помощью .setBoundary (), но это не помогло.
  • Был другой способ go в другие решения доступны онлайн. Я мог бы избавиться от заголовков с надписью ContentType.Application- JSON, однако удалить это не удастся на уровне API, так как у них есть проверки для этого, так что это тоже не сработает.
  • Я попытался добавить двоичное тело как часть, чтобы привести его в согласованное состояние, в результате чего код выглядел следующим образом

val data = MultipartEntityBuilder.create() .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) .addPart("Event Header", new StringBody(eventHeader,ContentType.APPLICATION_JSON)) .addPart("payload",new ByteArrayBody(requestBody, ContentType.DEFAULT_BINARY, null.asInstanceOf[String])) .build()

  • Попытка multipartEntityBuilder создать текстовое тело (для части JSON) и байтовый массив для части полезной нагрузки и избавиться от типа контента, используя следующий код

val data = MultipartEntityBuilder.create() .setBoundary(boundary) .addTextBody("Event Header",eventHeader,ContentType.APPLICATION_JSON) .addBinaryBody("Payload",requestBody,ContentType.DEFAULT_BINARY,null.asInstanceOf[String]) .build()

это дало мне дальнейшее понимание, так как в нем автоматически определялся ContentType как multipart/form-data, но когда я установил Entity для публикации, он не передавал эту информацию в POST, и это все равно неправильно назначало границу как часть типа содержимого в заголовке

  • Также попытался добавить заголовок из файла, убедившись, что эти два тела были согласованы по своей природе со следующим кодом

val file = new File("eventHeader.json") val data = MultipartEntityBuilder.create() .setMode(HttpMultipartMode.BROWSER_COMPATIBLE) .addBinaryBody("Event Header",file,ContentType.APPLICATION_JSON,"eventHeader.json") .addBinaryBody("Avro Payload",requestBody) .build()

Не повезло

Для получения дополнительной информации и контекста ниже приведены другие атрибуты запроса POST

val post = new HttpPost(url);
val client: CloseableHttpClient = HttpClientBuilder.create().build();
post.setConfig(requestConfig)
post.setHeader("Content-type", "multipart/form-data")
post.setEntity(data)

val response: HttpResponse = client.execute(post)

Другая часть информации, когда Я отлаживаю сущность в Intell iJ показывает мне созданную границу, но я нигде физически не вижу ее в контенте. (не уверен, насколько полезна эта информация)

Теперь, исключение относится к Springframework, и у меня есть ноющая подозрение, что scala плохо с этим играет. Тем не менее, мы успешно реализовали тестовый сценарий gatling ios в scala, так что это не совсем невозможно осуществить.

Следовательно, теперь я отдаюсь опыту сообщества о том, как go решить эту проблему, не будучи слишком агрессивным, потому что это будет частью службы искры, поэтому давайте не будем игнорировать аспект распределения данных всего этого ,

1 Ответ

0 голосов
/ 18 февраля 2020

Наконец-то я начал работать с простым добавлением границы из типа содержимого первоначально сгенерированных данных.

Ниже показано, как я изменил свой код для запроса на go через

val file = new File("testHeader.json")

   val data = MultipartEntityBuilder.create()
  .setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
  .addBinaryBody("Event Header",file,ContentType.APPLICATION_JSON,"testHeader.json")
  .addBinaryBody("Avro Payload",requestBody)
  .build()
val client: CloseableHttpClient = HttpClientBuilder.create().build();

val APIUrl = url

val post = new HttpPost(APIUrl);
post.setConfig(requestConfig)
post.setHeader(data.getContentType)
post.setEntity(data)

Простой Решение, но вроде обходного решения, по какой-то причине (о которой я не знаю), он не определял тип автоматически, когда я вообще не устанавливал тип содержимого. Надеюсь, это поможет другому бедному парню, как я, когда-нибудь в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...