2017-09-06 9 views
0

multipart/mixedリクエストをクライアントのakkaでどのように作成できますか?Scala(JSON +ファイル)でマルチパート/混合HTTPRequestを作成する方法

multipart/form-dataは、multipart/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を置き換えるためにいくつかのソリューションを試みたが、それらのどれも成功しませんでした:

  • クラスと特徴が封入されているので、私は
  • は、カスタム実装を作成することはできませんオーバーライドすることはできません(の99%を再利用しますMultipart-Formdata)は、Multipart.Formdataがプライベートコードを使用しているため、Multipartの特性の一部です。

私は簡潔に言えば、multipart/form-dataと99%類似しているmultipart/mixedリクエストを作成する手助けをしたいと思います。

PS:サーバは本当にmultipart/form-dataを受け入れない:/

編集:完全を期すため、DataSourceSingleUploadRequestはケースクラスであると私はアッカ-HTTPのバージョンを使用しているキルケ

答えて

0

を使用していますか?

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]) 
} 
関連する問題