了解喷雾:Demistification(Understanding Spray: Demistif

2019-10-21 20:20发布

有人可以帮助我得到的喷码保持以更好地了解如何喷? 我发送一个文件作为多数据的上下文。

这是建议我的代码是:

import akka.actor.ActorSystem
import spray.client.pipelining._
import spray.http.{MediaTypes, BodyPart, MultipartFormData}

object UploadFileExample extends App {
  implicit val system = ActorSystem("simple-spray-client")
  import system.dispatcher // execution context for futures below

  val pipeline = sendReceive
  val payload = MultipartFormData(Seq(BodyPart(new File("/tmp/test.pdf"), "datafile", MediaTypes.`application/pdf`)))
  val request =
    Post("http://localhost:8080/file-upload", payload)

  pipeline(request).onComplete { res =>
    println(res)
    system.shutdown()
  }
}

这是很好的,当然工作。

不过,我想明白了什么是引擎盖下,所以我可以自己做的事情:

下面是该代码来的困惑:

BodyPart(new File("/tmp/test.pdf"), "datafile", MediaTypes.`application/pdf`)

是第一个问题,事实上,BodyPart上只有一个应用方法是密切配合:

def apply(file: File, fieldName: String, contentType: ContentType): BodyPart = 
 apply(HttpEntity(contentType, HttpData(file)), fieldName, Map.empty.updated("filename", file.getName)) 

它需要的contentType,而不是一个的MediaType。

但是我发现的contentType

object ContentType { 

  private[http] case object `; charset=` extends SingletonValueRenderable 

  def apply(mediaType: MediaType, charset: HttpCharset): ContentType = apply(mediaType, Some(chars  et)) 

  implicit def apply(mediaType: MediaType): ContentType = apply(mediaType, None) }

但是ContentType的是不在主(见上面第一个代码。)的范围。因此,我不知道哪里是隐式转换从何而来?

然后,过去的事情,我不明白这里是

val payload = MultipartFormData(Seq(BodyPart(new File("/tmp/test.pdf"),
"datafile", MediaTypes.`application/pdf`)))
Post("http://localhost:8080/file-upload", payload)

这里的问题是,它是基于RequestBuilding(可在RequestBuilding来源中找到)

val Post = new RequestBuilder(POST)

用含有适用方法的对象:

def apply[T: Marshaller](uri: String, content: Option[T]): HttpRequest = apply(Uri(uri), content)
....
....
def apply[T: Marshaller](uri: Uri, content: Option[T]): HttpRequest = {
      val ctx = new CollectingMarshallingContext {
        override def startChunkedMessage(entity: HttpEntity, ack: Option[Any],
                                         headers: Seq[HttpHeader])(implicit sender: ActorRef) =
          sys.error("RequestBuilding with marshallers producing chunked requests is not supported")
      }
      content match {
        case None ⇒ HttpRequest(method, uri)
        case Some(value) ⇒ marshalToEntityAndHeaders(value, ctx) match {
          case Right((entity, headers)) ⇒ HttpRequest(method, uri, headers.toList, entity)
          case Left(error)              ⇒ throw error
        }
      }
    }

MultiPartFormData不是封送,因此,我不明白它是如何做的工作。

有人可以帮助我明白这一点?

非常感谢,

中号

文章来源: Understanding Spray: Demistification
标签: scala spray