Akka Http return 基于 Accept header 的不同类型的响应

Akka Http return different type of response based on Accept header

我是 scala 和 Akka-Http 的新手。试验 Akka-Http 编写休息服务。我必须returnjson或基于Acceptheader的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)
          }
        }
  }

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

最简单的方法是将支票移动到正文中。

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

想通了。

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

         }
     }
}