2013-05-06 3 views
5

Spray.io는 낮은 수준의 콘텐츠 형식을 정의하기 때문에 들어오는 요청의 콘텐츠 형식을 간단하게 참조하려면 어떻게해야합니까?Spray.io Content-Type을 요청에서 추출 하시겠습니까?

다음은 이미지가 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)) 
      } 
     } 
     } 

위의 코드에서 콘텐츠 유형을 추출하는 가장 쉬운 방법은 무엇입니까? 적절한 도형 패턴 일치를 사용하여 해당 fileExtension에 간단하게 사용할 수 있습니다. 당신의 도움을 주셔서 감사합니다.

답변

7

당신은 콘텐츠 형식을 추출하기 위해 자신의 지시를 구축 할 수 있습니다 당신은에있는 경우 야간에 빌드하면 MediaTypes에 이미 파일 확장자가 있으므로 거기에서 파일 확장명을 사용할 수 있습니다. 1.1-M7에서 제안한대로 자신 만의 매핑을 제공해야합니다.

3

난 당신이 HeaderDirectives에서 headerValue 지시어를 사용 할 수 있다고 생각 :

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

이 스프레이 1.0/1.1입니다.

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

다음 경로에서 사용 :

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

편집 :

+0

고마워요! 이게 실제로 머리글을 추출하는 "기본 제공"방법 인 것 같습니다. @ jrudolph의 솔루션은 스프레이 내의 다른 추출과 비슷하게 더 유용하기 때문에 인정할 것입니다. – crockpotveggies

관련 문제