【问题标题】:How to create multipart/mixed HTTPRequests in Scala (JSON+file)如何在 Scala 中创建多部分/混合 HTTPRequest(JSON+文件)
【发布时间】:2017-12-26 19:45:28
【问题描述】:

我们如何在客户端的akka​​中创建multipart/mixed请求?

multipart/form-datamultipart/mixed 有 99% 的相似性,但是 akka-http 只为前者提供便利方法,而不是后者,尽管它们有相似之处。

val jsonPayload = DataSourceSingleUploadRequest(
  "datasource-name",
  "datasource-username",
  "datasource-password",
)

import io.circe.generic.auto._, io.circe.syntax._

def createEntity: RequestEntity = {
  val fileFormPart = Multipart.FormData.BodyPart.fromPath("datasource", ContentTypes.`application/octet-stream`, Paths.get(extractFilePath))
  val jsonRequestFormPart = Multipart.FormData.BodyPart("request_payload", HttpEntity(ContentTypes.`application/json`, jsonPayload.asJson.noSpaces))

  Multipart.FormData(
    fileFormPart,
    jsonRequestFormPart
  ).toEntity()
}

理想的方式是拥有Multipart.MixedData。我已经尝试了几种解决方案来替换 mediaType,但都没有成功:

  • 类和特征是密封的,所以我不能覆盖
  • 无法创建 Multipart 特征的自定义实现(重用 Multipart-Formdata 的 99%),因为 Multipart.Formdata 使用私有代码。

我很短,我希望帮助创建与multipart/form-data 99% 相似的multipart/mixed 请求。

PS:服务器并没有真正接受multipart/form-data:/

编辑:为了完整起见,DataSourceSingleUploadRequest 是一个案例类,我使用的是 circe

【问题讨论】:

    标签: scala akka content-type akka-http


    【解决方案1】:

    您使用的是哪个版本的 akka-http?

    10.1.0-RC1 上,我可以看到Multipart.General.Strict(它可能也存在于早期版本中)。

    免责声明:下面的代码可以编译,但我还没有开始测试它。

    /*
    * Create a Multipart/mixed message body
    */
    private
    def genMultipart( set: Set[MyEntry] ): Multipart.General.Strict = {
      import scala.collection.immutable.{Seq => ImmutableSeq}
    
      val parts: Set[Multipart.General.BodyPart.Strict] = set.map {
        case MyEntry(keys, ct, value) =>
    
          val headers: ImmutableSeq[HttpHeader] = ImmutableSeq(
            RawHeader("X-AC-key1", keys._1),
            RawHeader("X-AC-key2", keys._2)
          )
          Multipart.General.BodyPart.Strict(
            HttpEntity.Strict(ContentTypes.`text/plain(UTF-8)`, ByteString("1,2,3")),   // some random values
            headers
          )
      }
    
      Multipart.General.Strict( MediaTypes.`multipart/mixed`, parts.to[ImmutableSeq] )
    }
    

    【讨论】:

      猜你喜欢
      • 2013-05-29
      • 1970-01-01
      • 2019-07-22
      • 2013-08-31
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      相关资源
      最近更新 更多