2016-05-24 3 views
1

私は数ヶ月間アクカの世界を去りました。明らかに私はモジョを失ってしまったのです。 Acceptヘッダーに基づいて、XMLまたはJSONドキュメントを返すWebサービスを作成しようとしています。Akka-httpでJSONまたはXMLをリクエストする方法は?

しかし、私はMarshallersを動作させることができません(406を返し、text/plainのみを受け入れます)。これは私が持っているものです。

trait MyMarshallers extends DefaultJsonProtocol with SprayJsonSupport with ScalaXmlSupport { 
    implicit def ec: ExecutionContext 

    implicit val itemJsonFormat = jsonFormat3(MyPerson) 


    def marshalCatalogItem(obj: MyPerson): NodeSeq = 
    <MyPerson> 
     <id> 
     {obj.ID} 
     </id> 
     <name> 
     {obj.Name} 
     </name> 
     <age> 
     {obj.Age} 
     </age> 
    </MyPerson> 

    def marshalCatalogItems(items: Iterable[MyPerson]): NodeSeq = 
    <Team> 
     {items.map(marshalCatalogItem)} 
    </Team> 

    implicit def catalogXmlFormat = Marshaller.opaque[Iterable[MyPerson], NodeSeq](marshalCatalogItems) 

    implicit def catalogItemXmlFormat = Marshaller.opaque[MyPerson, NodeSeq](marshalCatalogItem) 

    implicit val catalogMarshaller: ToResponseMarshaller[Iterable[MyPerson]] = Marshaller.oneOf(
    Marshaller.withFixedContentType(MediaTypes.`application/json`) { catalog ⇒ 
     HttpResponse(entity = HttpEntity(ContentType(MediaTypes.`application/json`), 
     catalog.map(i ⇒ MyPerson(i.ID, i.Name, i.Age)) 
      .toJson.compactPrint)) 
    } 
    , 
    Marshaller.withOpenCharset(MediaTypes.`application/xml`) { (catalog, charset) ⇒ 
     HttpResponse(entity = HttpEntity.CloseDelimited(ContentType(MediaTypes.`application/xml`, HttpCharsets.`UTF-8`), 
     Source.fromFuture(Marshal(catalog.map(i => MyPerson(i.ID, i.Name, i.Age))) 
      .to[NodeSeq]) 
      .map(ns ⇒ ByteString(ns.toString())) 
    ) 
    ) 
    } 
) 
} 

と私のルートは次のようになります。

class MyService extends MyMarshallers { 
    implicit val system = ActorSystem("myService") 
    implicit val materializer = ActorMaterializer() 
    implicit val ec: ExecutionContext = system.dispatcher 

    ... 
    def route = ... 
     (get & path("teams")) { 
       parameters('name.as[String]) { id => 
       complete { 
        getTeam(id) 
       } 

       } 
     ... 

} 

そして、私は/を要求した場合、/ Iは、プレーンテキストを取得するが、私は、アプリケーション/ xmlまたはアプリケーションを要求した場合json、私は406を取得します。

AKKA-HTTPはどのようなコンテンツタイプを受け入れるのですか?私はすべてをAkka 2.4.6に更新しました。

答えて

0

申し訳ありませんが、わかりました。 - XMLのマーシャラーにfromFutureの代わりにfromIteratorを使用するように変更

  • 問題1:上記のコードは、そのうちの一つは、問題を修正し、二つの問題がありました。
  • 問題2 - 私のgetTeam()メソッドがIterableを返していました。私はそれをSeqに変更しました。

すべてが機能します。

+0

ヘイウィル!あなたはakkaについて多くの質問をしましたが、答えはめったに受け入れられませんでした。答えがあなたの必要を満たすならば、そうしてください。ユーザーがより多くのことを助けることを奨励します。ありがとう! – expert

+1

私はどこで答えを受け入れなかったのか分かりません。私がしなかったら、それは省略でなければなりません。しかし、答えがないかどうか調べるのに数時間かかることがあります。そして、例えば、私は別の10時間自分の答えを受け入れることはできません。 –

+1

私は過去のいくつかの質問を確認しましたが、私はすべての回答を受け入れました。私は戻ってきて返事を確認する機会がなかった2つを除いて。私に何もない気分にさせてくれてありがとう。 :( –

関連する問題