2013-04-01 5 views
2

나는 다음 구문을 사용 : 나는 동일한 작업을 수행하기 위해 노력하고있어 GET 요청에 대한 지금스프레이의 GET 요청에 대해 다른 상태 코드로 어떻게 대응해야합니까? POST와 PUT 요청에 대한

put { 
    entity(as[CaseClass]) { entity => 
    returnsOption(entity).map(result => complete{(Created, result)}) 
     .getOrElse(complete{(NotFound, "I couldn't find the parent resource you're modifying")}) 
    } 
} 

을,하지만 난 내 PUT 솔루션과 유사하게 동작하지 않습니다. GET 요청으로이 작업을 수행하는 좋은 방법은 무엇입니까?

업데이트 :이 다음과 같은 해킹 작업있어 한 :이 문제를 제공하기 때문에, 내가 () => 또는 ctx => 함께 할 수 유사한 무언가를 기대할 수 있지만,이 운행하지 않는

(get & parameters('ignored.?)) { 
    //TODO find a way to do this without ignored parameters 
    (ingored:Option[String]) => { 
    returnsOption().map(result => complete(result)) 
     .getOrElse(complete{(NotFound, "")}) 
    } 
} 

마샬링을 사용하여 :

... could not find implicit value for evidence parameter of type spray.httpx.marshalling.Marshaller[(spray.http.StatusCodes.ClientError, String)] 
    }).getOrElse(ctx.complete{(NotFound, "")}) 
          ^

내가 어떻게 스프레이 - json을 사용한다는 사실과 관련이있을 수 있습니까?

답변

4

이 코드는 작동합니다 :

get { 
    ctx => 
    ctx.complete(returnsOption()) 
} 

을 시작 ctx =>를 사용하지 않는 경우, 코드 만 경로 빌드 시간에 실행 될 수 있습니다.

여기에 몇 가지 설명을 찾을 수 있습니다 Understanding the DSL Structure

+0

그게 효과가 있지만 그 옵션에 따라 다른 StatusCode를 반환하고자합니다. 완료 할 옵션을 매핑하면 시작할 때 한 번만 실행됩니다. 이는 내 의도가 아닙니다. – iwein

+0

그 이유는 위의 문서를 읽어야하는 이유입니다. 중요한 것은 'ctx =>'로 시작하는 블록 안의 코드 만 각 요청에 대해 실행되도록 보장하고 다른 코드는 (요청 처리 시간에있을 수도 있지만 반드시 필요한 것은 아닐 수도 있음) 실행될 수 있다는 것을 이해하는 것입니다. 경로 _building_ 시간. – jrudolph

+0

@jrudolph 그 부분을 반영하도록 질문을 편집하겠습니다. 이제 코드가 옵션의 내용에 따라 다른 상태 코드를 반환하면 완전히 질문에 대답하게됩니다. – iwein

15

사용과 같은 HttpResponse을 예를 들어

complete{ 
    HttpResponse(StatusCodes.OK, HttpBody(ContentType(`text/html`), "test test: " + System.currentTimeMillis.toString)) 
} 

업데이트 : 지금 잠시 동안 스프레이를 사용하고. 더 나은 방법이 있습니다 :

complete { 
    StatusCodes.BandwidthLimitExceeded -> MyCustomObject("blah blah") 
} 
+0

이것을 작성하는 좀 더 간결한 방법이 있습니까? – Phil

+1

@ Phil이 질문에 대해 생각 나게 해 주셔서 감사합니다. 예, 더 좋은 방법이 있습니다. 나는 대답을 업데이트했다. – expert

관련 문제