2013-05-06 19 views
5

Poiché Spray.io sta definendo i tipi di contenuto a un livello basso, come faccio a fare semplicemente riferimento al tipo di contenuto della richiesta in entrata?Estrarre il tipo di contenuto Spray.io dalla richiesta?

Ecco un breve esempio in cui un'immagine è PUT.

 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)) 
      } 
     } 
     } 

Dato il codice sopra, quale è un modo semplice per estrarre il tipo di contenuto? Posso semplicemente usarlo per abbinare il modello allo fileExtension appropriato. Grazie per l'aiuto.

risposta

7

È possibile costruire il proprio direttiva per estrarre il contenuto-tipo:

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

e poi utilizzarlo nella vostra rotta:

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

Edit: Se si è in build notturne, MediaTypes contengono già estensioni di file in modo da poter utilizzare quelle da lì. Su 1.1-M7 devi fornire la tua mappatura come suggerito.

3

Penso che si possa utilizzare la direttiva headerValue da HeaderDirectives:

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

Questo è per Spray 1.0/1.1.

+0

Grazie! Sembra che questo sia davvero il modo "integrato" per estrarre un'intestazione. Ammetto che la soluzione di @jrudolph è più utilizzabile poiché funziona in modo simile ad altre estrazioni all'interno di Spray. – crockpotveggies

Problemi correlati