Как представить запрос данных формы, используя Akka HTTP? - PullRequest
0 голосов
/ 26 апреля 2018

Я хочу создать http-запрос формы данных к Facebook API , используя Akka HTTP. В curl пример запроса выглядит так:

curl \
 -X POST \
 "https://graph-video.facebook.com/v2.3/1533641336884006/videos"  \
 -F "access_token=XXXXXXX" \
 -F "upload_phase=transfer" \
 -F "start_offset=0" \
 -F "upload_session_id=1564747013773438" \
 -F "video_file_chunk=@chunk1.mp4"

Итак, я создал следующую модель для представления полезной нагрузки запроса:

case class FBSingleChunkUpload(accessToken: String, 
    sessionId: String,
    from: Long, 
    to: Long, 
    file: File) //file is always ~1Mb

Тогда я собираюсь использовать:

Http().cachedHostConnectionPoolHttps[String]("graph-video.facebook.com")

Но я не знаю, как преобразовать FBSingleChunkUpload в правильный HttpRequest: (

Можете ли вы дать мне подсказку, как представлять запросы такого типа, используя Akka HTTP?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

В curl опция -F определяет POST, используя тип контента "multipart / form-data". Чтобы создать такой запрос в Akka HTTP, используйте Multipart.FormData (defaultEntity ниже заимствовано из HTTP Akka MultipartSpec):

val chunkUpload = FBSingleChunkUpload(...)

def defaultEntity(content: String) =
  HttpEntity.Default(ContentTypes.`text/plain(UTF-8)`, content.length, Source(ByteString(content) :: Nil))

val streamed = Multipart.FormData(Source(
  Multipart.FormData.BodyPart("access_token", defaultEntity(chunkUpload.accessToken)) ::
  Multipart.FormData.BodyPart("upload_phase", defaultEntity("transfer")) ::
  Multipart.FormData.BodyPart("start_offset", defaultEntity(chunkUpload.from.toString)) ::
  Multipart.FormData.BodyPart("upload_session_id", defaultEntity(chunkUpload.sessionId)) ::
  Multipart.FormData.BodyPart.fromFile(
    "video_file_chunk", ContentType.Binary(MediaTypes.`video/mp4`), chunkUpload.file
  ) :: Nil))

val request =
  HttpRequest(method = HttpMethods.POST, uri = /** your URI */, entity = streamed.toEntity)
0 голосов
/ 26 апреля 2018

Для этого есть FormData Entity тип

 val fBSingleChunkUpload = ???
 HttpRequest(method = HttpMethods.POST,
              entity = FormData(("accessToken", fBSingleChunkUpload.accessToken), ...).toEntity)

Дополнительно для файла вы можете проверить, работает ли он с Multipart.FormData

 val fileFormPart = Multipart.FormData
    .BodyPart("name", HttpEntity(MediaTypes.`application/octet-stream`, file.length(), FileIO.fromPath(file.toPath)))

  val otherPart = Multipart.FormData.BodyPart.Strict("accessToken", "the token")

  val entity =
    Multipart.FormData(otherPart, fileFormPart).toEntity
...