2014-11-11 7 views
1

때 그때 내가 그러나사용자 정의 개체를 사용하는 대신 HttpResponse에

val futureResponse = pipeline(Post(url, body)) futureResponse.map(_.status) 

를 사용하여 같은 HttpResponse에의 객체를 상태 코드를 얻을 수

val pipeline: HttpRequest => Future[HttpResponse] = addHeader(.......) ~> sendReceive ~>  unmarshal[HttpResponse]   

를 사용할 때 응답 코드를 얻는 방법, 때

val pipeline: HttpRequest => Future[MyResponse] = addHeader(.......) ~> sendReceive ~>  unmarshal[MyResponse] 

012를 사용 : 나는 사용자 정의 Unmarshaller에를 사용
val myfutureResponse = pipeline(Post(url, body)) 
myutureResponse.map(_.status) 

상태를 찾을 수 없으므로 컴파일되지 않습니다. 상태 코드는 어떻게 얻습니까? 내 json 결과를 deserialize 수 있도록 사용자 지정 unmarshaller 사용해야합니다.

답변

0

마지막으로 나는

은 내가 길에서이 문제를 가지고 이제

val pipeline: HttpRequest => HttpResponse = addHeader(.......) ~> sendReceive 
val searchResponse = pipeline(Post(urlwithpath, queryString)).map { 
    response => response.status match { 
    case StatusCodes.OK => 
     Some(unmarshal[MyResponse](response)) 
    case StatusCodes.NotFound => print(StatusCodes.NotFound) 
    } 
} 

로 내 파이프 라인 방식을 변경하여 제안

private def unmarshal[T: Unmarshaller](response: HttpResponse): T = { 
response.entity.as[T] match { 
    case Right(value) => value 
    case Left(error) ⇒ throw new PipelineException(error.toString) 
} 

}에 따라 답을 발견 나는 API를 제대로 배울 것입니다.

1

파이프 라인에서 언 마셜 러를 하드 코딩하면 상태 코드를 얻을 수 없습니다. Future이 실패하게되는 예외의 일부이기 때문에 여전히 실패 코드가 발생합니다.

정말 그 정보를 유지하고 당신이이 종류의 응답을 제공 할 수 있습니다 자신의 취소 마샬를 작성해야합니다 파이프 라인에서 취소 마샬을 사용하려면 :

case class Wrapper[T](response: T, status: StatusCode) 

val pipeline: HttpRequest => Future[Wrapper[MyResponse]] = addHeader(.......) ~> sendReceive ~> myUnmarshall[MyResponse] 

이를 스프레이 내부를 모르는 경우 매우 까다로울 수 있습니다. 또 다른 옵션은 파이프 라인에 unmarshall 비트를 하드 코드하지 않고 수동으로 JSON을 비 직렬화하는 것입니다.

+0

좋습니다. 포인터를 가져 주셔서 감사합니다. 시체를 가져오고 코드를 얻기 위해 다른 요청을하는 것은 아닙니다. 재미있는 점은 언 마샬 러 내부의 값을 하드 코딩하고 있다는 것을 알지 못했다는 것입니다. 나는 내가 인터넷에서 발견 한 예들을 따랐다. – Sheggetin

+0

내가 말한 것은 당신이 unmarshaller를 파이프 라인의 일부로 하드 코딩하고 있다는 것입니다. 구현 방법을 살펴보고 다른 동작을 원한다면 구현할 수 있습니다. –

+0

아직 제안 된 솔루션에 대해 100 % 명확하지 않습니다. 불행히도 인터넷에 예제가 많이 없습니다. 내가 온라인에서 보았던 솔루션 중 하나는 httpresonse를 캡처하여 파이프 마샬링 전에 'code'def mapStatus : HttpResponse => HttpResponse = { case H @ HttpResponse (status, entity, _, _)) => r.withEntity (entity.map ((ct, buf) => ContentType.'application/json' -> buf)) case x => x} val 파이프 라인 : HttpRequest => Future [래퍼 [MyResponse] ] => sendReceive ~> mapStatus ~> myUnmarshall [MyResponse] – Sheggetin