Akka Http基于Accept标头返回不同类型的响应

时间:2015-12-10 16:52:41

标签: scala akka spray akka-http

我是scala和Akka-Http的新手。尝试Akka-Http编写休息服务。我必须根据Accept标题返回json或protobuf。

 optionalHeaderValueByName("Accept"){ contentType =>
  if(contentType == Some(protoEncode)) {
    complete {
      NewsService.getNewsList().map {
        case stories: List[Story] =>    HttpResponse(entity = HttpEntity(ContentType(protoEncoding),  StoryList(stories).toProto().build().toByteArray))
      }
    }
  } else {
      complete {
        NewsService.getNewsList().map {
          case stories: List[Story] => StoryList(stories)
          }
        }
  }

正如您所看到的,代码重复正在发生,任何人都可以建议什么是优化和概括设计以避免这种情况的最佳方式。

2 个答案:

答案 0 :(得分:0)

最简单的方法是将支票移到身体内。

optionalHeaderValueByName("Accept"){ contentType =>
      complete {
        NewsService.getNewsList().map {
          case stories: List[Story] =>
            if(contentType == Some(protoEncode)) {
              HttpResponse(entity = HttpEntity(ContentType(protoEncoding),  StoryList(stories).toProto().build().toByteArray))
            } else
              StoryList(stories)
        }  
      }
  }

答案 1 :(得分:0)

想出来。

optionalHeaderValueByName("Accept") { contentType =>
   onSuccess(NewsService.getNewsList()) {
       case stories: List[Story] => contentType match {
           case Some(protoEncodingString) => complete(HttpResponse(entity = HttpEntity(ContentType(protoEncoding),  StoryList(stories).toProto().build().toByteArray)))
           case  _=> complete(StoryList(stories))

         }
     }
}