Отправка http-ответа с содержимым Json с использованием marshallers в Akka Http

Я хочу отправить ответ об ошибке Http с сообщением в формате JSON в теле. У меня возникли проблемы с использованием PredefinedToResponseMarshallers.

Я видел реализацию в Akka docs, но я пробовал нечто подобное, и это выдает ошибку компиляции.

import argonaut._, Argonaut._
import akka.http.scaladsl.marshalling.Marshal
import akka.http.scaladsl.server.Directives._
import akka.http.scaladsl.model.HttpResponse
import akka.http.scaladsl.model.headers._
import akka.http.scaladsl.model.StatusCodes._
import akka.http.scaladsl.marshalling.{ Marshaller, ToResponseMarshaller } 

trait Sample extends Marshallers with Directives { 
     def login(user: Login): CRIX[HttpResponse] = {
        for {
          verification ← verify(user)
          resp = if (verification) {
            HttpResponse(NoContent, headers = Seq(
              .........
            ))
          }//below is my http Error response
          else Marshal(401 → "It is an Unauthorized Request".asJson).to[HttpResponse]
        } yield resp
      }
    }

Это дает эту ошибку компиляции:

Sample.scala:164: type mismatch;
[error]  found   : Object
[error]  required: akka.http.scaladsl.model.HttpResponse
[error]     } yield resp
[error]             ^
[error] one error found
[error] (http/compile:compileIncremental) Compilation failed

Я только что запустил Akka Http, так что простите меня, если это тривиально просто.

TL;DR: я хочу (примеры), чтобы узнать, как использовать ToResponseMarshallers в Akka Http.


person Sudhanshu    schedule 04.06.2017    source источник


Ответы (1)


Метод to[HttpResponse] отрицательного условия принимает Future[HttpResponse]. При этом положительное условие возвращает HttpResponse.

Попробуйте что-то вроде (я предполагаю, что verify принимает Future[T]):

for {
  verification <- verify(user)
  resp <- if (verification) 
           Future.successful(HttpResponse(NoContent, headers = Seq(.........)) )
         else 
           Marshal(401 → "It is an Unauthorized Request".asJson).to[HttpResponse]
} yield resp
person Zernike    schedule 04.06.2017