2

我是 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)
          }
        }
  }

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

4

2 回答 2

1

最简单的方法是在体内移动支票。

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)
        }  
      }
  }
于 2015-12-10T18:44:30.300 回答
1

弄清楚了。

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))

         }
     }
}
于 2015-12-15T17:08:41.887 回答