从Spray POST中提取Json作为字符串,而不是通过封送到实体

时间:2015-10-13 02:27:22

标签: apache-kafka spray-json

现有的问题包含了我所追求的大部分内容:

{{3}}

但是如果没有解释如何从指令[String]中获取实际的Json字符串表示,它就会停止。我正在尝试将Json数据作为字符串(Kafka Producer序列化)发送给Kafka,所以我试图以字符串形式提取Json。我将对卡夫卡消费者的另一端的实体进行编组。上面的答案链接让我接近:

def rawJson = extract { _.request.entity.asString}  
case "value2" => rawJson{ json =>// use the json } 

但我最终得到了指令[String]。如何获取String?

2 个答案:

答案 0 :(得分:0)

您引用的示例应该有效。您将使用它们定义的rawJson指令来包装您的内部路由,并且json字符串将在该内部路由中可用。

在下面的示例中,personJson是一个String,由请求的主体通过rawJson指令提取,并且可用于完成其余工作的内部路径。

  def rawJson = extract { _.request.entity.asString}

  val personRoute = {
    (post & path("persons")){
      rawJson{ personJson =>
        onSuccess(personService.addPerson(person)){ personWithId =>
          complete(StatusCodes.Created, personWithId)
        }
      }
    }

答案 1 :(得分:0)

我想出了以下语法,它完成了以String形式提取Json的需要。起初我认为我解组然后再次重新编组效率很低,但后来我意识到这提供了一种即时Json验证的形式。但是可能有更有效的方法来做到这一点。

API都是Spray。 handleWith使用对RawWeatherData案例类的隐式转换。

path("weather"/"data"/"json") {
    handleWith { rawRecord: RawWeatherData =>
        val rawJsonStr = rawRecord.toJson.toString
        kafkaJsonRecordIngest(rawJsonStr)
        rawRecord
    }
}