2013-05-06 11 views
5

Ponieważ Spray.io definiuje typy zawartości na niskim poziomie, w jaki sposób mogę po prostu odwołać się do typu zawartości przychodzącego żądania?Wyodrębnij typ zawartości Spray.io z zapytania?

Oto krótki przykład, w którym obraz jest 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)) 
      } 
     } 
     } 

Jaki jest łatwy sposób wyodrębnienia rodzaju zawartości, biorąc pod uwagę powyższy kod? Mogę po prostu użyć tego do dopasowania wzoru do odpowiedniego fileExtension. Dzięki za pomoc.

Odpowiedz

7

Możesz budować własną dyrektywę wyodrębnić Content-Type:

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

a następnie używać go w trasie:

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

Edytuj: Jeśli jesteś na nocne kompilacje, MediaTypes zawierają już rozszerzenia plików, więc możesz użyć tych z nich. W wersji 1.1-M7 musisz podać swoje własne mapowanie zgodnie z sugestią.

3

myślę, że można użyć dyrektywy headerValue z HeaderDirectives:

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

To dla Spray 1.0/1.1.

+0

Dzięki! Wygląda na to, że jest to rzeczywiście "wbudowany" sposób na wyodrębnienie nagłówka. Przyznaję, że rozwiązanie @ jrudolph jest bardziej użyteczne, ponieważ działa podobnie do innych ekstraktów w Sprayu. – crockpotveggies

Powiązane problemy