У меня есть тело запроса, состоящее из более чем одной части тела, и ниже показано, как я обрабатываю его в 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 решить эту проблему, не будучи слишком агрессивным, потому что это будет частью службы искры, поэтому давайте не будем игнорировать аспект распределения данных всего этого ,