如何使用 Akka HTTP 表示表单数据请求?
How to represent a form-data request using Akka HTTP?
我想使用 Akka HTTP 创建一个到 Facebook API 的表单数据 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 表示此类请求?
有一个 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
在 curl 中,-F
选项规定 POST 使用 "multipart/form-data" 内容类型。要在 Akka HTTP 中创建这样的请求,请使用 Multipart.FormData
(defaultEntity
below is borrowed from Akka HTTP's 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)
我想使用 Akka HTTP 创建一个到 Facebook API 的表单数据 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 表示此类请求?
有一个 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
在 curl 中,-F
选项规定 POST 使用 "multipart/form-data" 内容类型。要在 Akka HTTP 中创建这样的请求,请使用 Multipart.FormData
(defaultEntity
below is borrowed from Akka HTTP's 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)