首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring webflux代理多部分数据

Spring webflux代理多部分数据
EN

Stack Overflow用户
提问于 2019-06-26 14:51:38
回答 1查看 1.6K关注 0票数 0

我有获取ServerRequest的组件,然后将其转换为WebClient,并将其代理到目的地。Content-请求的类型为multipart/form-data

代码语言:javascript
运行
复制
return getBody(request)
    .flatMap { body ->
      WebClient.builder()
          .baseUrl(path)
          .defaultCookies { x ->
            request.cookies()
                .forEach { (k, v) -> x[k] = v.map { it.value } }
          }
          .defaultHeaders { x ->
            request.headers().asHttpHeaders()
                .forEach { (k, v) -> x[k] = v }
          }
          .defaultUriVariables(request.queryParams())
          .build()
          .method(request.method() ?: HttpMethod.GET)
          .body(body)
          .exchange()
    }

  private fun getBody(request: ServerRequest): Mono<BodyInserter<*, in ClientHttpRequest>> {
    return request.multipartData()
        .filter { it.isNotEmpty() }
        .map<BodyInserter<*, in ClientHttpRequest>> { multipart ->
          BodyInserters.fromMultipartData(multipart)
        }
        .switchIfEmpty(Mono.fromCallable {
          val body = request.bodyToMono(String::class.java)
          BodyInserters.fromPublisher(body, String::class.java)
        })
  }

我有一个关于多部分请求的问题:当尝试创建包含多部分的正文以将其发送到目的地时,它会失败。

我有以下配置:

代码语言:javascript
运行
复制
@Configuration
open class SwitcherMultipartConfigurer : WebFluxConfigurer {

  override fun configureHttpMessageCodecs(configurer: ServerCodecConfigurer) {
    configurer.customCodecs().reader(
        MultipartHttpMessageReader(SynchronossPartHttpMessageReader())
    )
    configurer.customCodecs().writer(
        MultipartHttpMessageWriter(

        )
    )
  }
}

它可以是什么?错误是:

代码语言:javascript
运行
复制
 observed an error org.springframework.core.codec.CodecException: No suitable writer found for part: file
      | 2019-06-25T13:33:49.069006743Z  at org.springframework.http.codec.multipart.MultipartHttpMessageWriter.encodePart(MultipartHttpMessageWriter.java:300)
      | 2019-06-25T13:33:49.069013261Z  at org.springframework.http.codec.multipart.MultipartHttpMessageWriter.lambda$encodePartValues$4(MultipartHttpMessageWriter.java:253)
      | 2019-06-25T13:33:49.069018616Z  at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
      | 2019-06-25T13:33:49.069023613Z  at java.util.LinkedList$LLSpliterator.forEachRemaining(LinkedList.java:1235)
      | 2019-06-25T13:33:49.069028522Z  at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
      | 2019-06-25T13:33:49.069033432Z  at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
      | 2019-06-25T13:33:49.069038361Z  at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
      | 2019-06-25T13:33:49.069043368Z  at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
      | 2019-06-25T13:33:49.069048212Z  at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
      | 2019-06-25T13:33:49.069053089Z  at org.springframework.http.codec.multipart.MultipartHttpMessageWriter.encodePartValues(MultipartHttpMessageWriter.java:253)
      | 2019-06-25T13:33:49.069058115Z  at org.springframework.http.codec.multipart.MultipartHttpMessageWriter.lambda$writeMultipart$3(MultipartHttpMessageWriter.java:234)
EN

回答 1

Stack Overflow用户

发布于 2019-06-27 16:41:57

找到做这件事的方法。我代理多部分数据不是作为MultipartHttpReader创建的Part,而是作为ByteArray

代码语言:javascript
运行
复制
  val builder = MultipartBodyBuilder()
  multipart
      .toSingleValueMap()
      .forEach {
        builder.asyncPart(it.key, it.value.content(), DataBuffer::class.java)
            .headers { httpHeaders -> it.value.headers().forEach { httpHeaders[it.key] = it.value } }
      }
  BodyInserters.fromMultipartData(builder.build())

需要header来保存Content-Disposition header中显示的content-type和filename。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56766820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档