Как вызвать POST в другой сервис и получить данные JSON - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть два сервиса HTTP Akka (Сервис 1 и Сервис 2).Один должен общаться с другим.

Служба 2 предоставляет POST конечную точку /lastname, которая принимает полезную нагрузку json, например {name: "doe"}, и возвращает {"returnVal":false} или {"returnVal":true}

Вопрос

Как к нему может подключиться служба 1, отправить полезную нагрузку json и получить логический ответ?

Я пытаюсь выполнить следующее:

val responseFuture: Future[HttpResponse] = Http().singleRequest(
  HttpRequest(
    uri = s"$host:$port/my/endpoint")
    entity = HttpEntity(MediaTypes.`application/json`, method = HttpMethods.POST)
)

, но не могу понятьдля отправки данных JSON {name: "doe"} вместе с запросом.

1 Ответ

0 голосов
/ 31 декабря 2018

для создания JSON вам нужно использовать json marshaller, например upickle , spray-json .Я использую спрей JSON для преобразования классов Scala в JSON и наоборот.Я предполагаю, что Service2 принимает {"name": "paul"} как запрос и возвращает {"Существовать": true} как ответ.

import spray.json.{DefaultJsonProtocol, RootJsonFormat}


case class NameExistsRequest(name: String)
case class NameExistsResponse(exist: Boolean)

object ServiceJsonProtocolNameExists extends DefaultJsonProtocol{
  implicit val nameExistsRequestJF: RootJsonFormat[NameExistsRequest] = jsonFormat1(NameExistsRequest)
  implicit val nameExistsResponseJF: RootJsonFormat[NameExistsResponse] = jsonFormat1(NameExistsResponse)
}


  case object NameExistsError extends RuntimeException with NoStackTrace

  case object InternalError extends RuntimeException with NoStackTrace

  def sendNameExistsRequest(): Future[NameExistsResponse] = {
    import ServiceJsonProtocolNameExists._
    import spray.json._

    val endpoint = "http://your-endpoint"
    val request = NameExistsRequest("paul")
    val httpRequest = HttpRequest(
      method = HttpMethods.POST,
      uri = Uri(endpoint),
      headers = List.empty,
      entity = HttpEntity(ContentTypes.`application/json`, request.toJson.toString)
    )


    Http().singleRequest(httpRequest).transformWith {
      case Success(response) =>
        response match {
          case HttpResponse(StatusCodes.OK, _, entity, _) =>
            Unmarshal(entity).to[String].map {content =>
              content.parseJson.convertTo[NameExistsResponse]
            }
          case res =>
            println("failure response: " + res)
            Future.failed(NameExistsError)
        }
      case Failure(f) =>
        println("failed to send request, caused by: " + f)
        Future.failed(InternalError)
    }

  }

, который NameExistsRequest представляет ваш запрос, и мы преобразуем его в json с помощью метода toJson, а NameExistsResponse - ваш ответ, возвращенный Service2.мы используем Unmarshall и convertTo для преобразования json в класс scala.

...