2013-05-06 5 views
5

Da Spray.io Inhaltstypen auf einer niedrigen Ebene definiert, wie kann ich einfach auf den Inhaltstyp der eingehenden Anfrage verweisen?Den Spray.io Content-Type aus Anfrage extrahieren?

Hier ist ein kurzes Beispiel, wo ein Bild PUT ist.

 put { 
     entity(as[Array[Byte]]) { data => 
      complete{ 
      val guid = Image.getGuid(id) 
      val fileExtension = // match a file extension to content-type here 
      val key = "%s-%s.%s" format (id, guid, fileExtension) 
      val o = new Image(key, contentType, data) 
      Image.store(o) 
      val m = Map("path" -> "/client/%s/img/%s.%s" format (id, guid, fileExtension)) 
      HttpResponse(OK, generate(m)) 
      } 
     } 
     } 

Angesichts der Code oben, was ist eine einfache Möglichkeit, den Inhaltstyp zu extrahieren? Ich kann das einfach verwenden, um ein Muster zu einem passenden fileExtension zu matchen. Danke für Ihre Hilfe.

Antwort

7

Sie können Ihre eigene Richtlinie zu extrahieren den Content-Type bauen:

val contentType = headerValuePF { case `Content-Type`(ct) => ct }

und es dann in Ihre Route:

put { 
    entity(as[Array[Byte]]) { data => 
     contentType { ct => // ct is instance of spray.http.ContentType 
     // ... 
     } 
    } 
    } 

bearbeiten: Wenn Sie auf das sind Nightly Builds, MediaTypes enthalten bereits Dateierweiterungen, sodass Sie die von dort verwenden können. Auf 1.1-M7 müssen Sie Ihr eigenes Mapping bereitstellen, wie Sie es vorgeschlagen haben.

3

Ich glaube, Sie die headerValue Direktive von HeaderDirectives verwenden:

import spray.http.HttpHeaders._ 
headerValue(_ match { 
    case `Content-Type`(ct) => Some(ct) 
    case _ => None 
}) { ct => 
    // ct has type ContentType 
    // other routes here 
} 

Dies ist für Spray 1.0/1.1.

+0

Danke! Sieht so aus, als wäre dies die "eingebaute" Möglichkeit, einen Header zu extrahieren. Ich gebe zu, @ Jrudolphs Lösung ist jedoch brauchbarer, da sie ähnlich wie andere Extraktionen in Spray funktioniert. – crockpotveggies