Я пытаюсь реализовать пользовательский парсер данных multipartFormData для обработки обратного вызова из API-интерфейса Sendgrid. Обратный вызов - это множественный запрос, в котором данные могут быть закодированы в разных кодировках: например, utf-8
или ISO-8859-1
.Пользовательский парсер multipartFormData в play2 scala для обработки нескольких кодировок в dataparts
Sendgrid обеспечивает поле Кодировки, которое просто объект JSON, который объясняет, что кодирующая каждое поле имеет:
{"to":"UTF-8","html":"ISO-8859-1","subject":"UTF-8","from":"UTF-8","text":"ISO-8859-1"}
Я в настоящее время извлечения кодировок из dataParts так:
val charsets = extract(request.body.dataParts, "charsets", _.as[Charsets]).getOrElse(Charsets(Some(""), Some(""), Some(""), Some(""), Some("")))
def extract[T](env: Map[String, Seq[String]], key: String, conv: JsValue => T): Option[T] = {
env.get(key).flatMap(_.headOption).map(Json.parse).map(conv)
}
case class Charsets(to: Option[String], html: Option[String], subject: Option[String], from: Option[String], text: Option[String])
object Charsets {
implicit val charsetReads = Json.format[Charsets]
}
но привычка поскольку все может иметь неправильную кодировку, установленную синтаксическим анализатором.
Оригинальный handleDataPart
является жёстко использовать utf-8
def handleDataPart: PartHandler[Part] = {
case headers @ Multipart.PartInfoMatcher(partName) if !Multipart.FileInfoMatcher.unapply(headers).isDefined =>
Traversable.takeUpTo[Array[Byte]](DEFAULT_MAX_TEXT_LENGTH)
.transform(Iteratee.consume[Array[Byte]]().map(bytes => DataPart(partName, new String(bytes, "utf-8"))))
.flatMap { data =>
Cont({
case Input.El(_) => Done(MaxDataPartSizeExceeded(partName), Input.Empty)
case in => Done(data, in)
})
}
}
Так что я хотел бы сделать, это начать извлекать возражают кодировок, а затем использовать его при создании Dataparts или вместо создания строки для каждого поле, создайте Array [Byte], а затем в моем контроллере обработайте создание строк. Может быть, есть и другой способ? Как бы вы решили это? Я чувствую себя застрявшим и нуждаюсь в каком-то руководстве.