2

私はscalaとAkka-Httpの初心者です。残りのサービスを書くための Akka-Http の実験。ヘッダーに基づいて json または protobuf を返す必要がありAcceptます。

 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 =>
   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 に答える
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 に答える