Извлеките Json из Spray POST в виде строки, а не путем маршалинга в объект


person Richard Walker    schedule 13.10.2015    source источник


Ответы (2)


Пример, на который вы ссылаетесь, должен работать. Вы должны использовать директиву rawJson, которую они определили для переноса вашего внутреннего маршрута, и строка json будет доступна внутри этого внутреннего маршрута.

В приведенном ниже примере personJson — это строка, извлекаемая телом запроса с помощью директивы rawJson и доступная для внутреннего маршрута, где выполняется остальная часть работы.

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

  val personRoute = {
    (post & path("persons")){
      rawJson{ personJson =>
        onSuccess(personService.addPerson(person)){ personWithId =>
          complete(StatusCodes.Created, personWithId)
        }
      }
    }
person Eric Woods    schedule 15.10.2015
comment
Эрик, спасибо за ваш ответ, но на мой вопрос мне действительно нужно заполучить строку, чтобы я мог отправить ее как сериализованную строку в Кафку (что может быть сценарием, с которым вы не знакомы). В любом случае, я придумал синтаксический сценарий, который пока отвечает всем требованиям, и я опубликую его ниже. - person Richard Walker; 16.10.2015
comment
У вас есть доступ к String — в приведенном выше примере это personJson. Но, как и многие проблемы, есть несколько возможных решений. Похоже, вы нашли решение, которое работает для вас. - person Eric Woods; 17.10.2015
comment
Эрик, о, ладно, я не мог сказать, потому что не вставил его в свою ScalaIDE, которая хорошо говорит мне о типах. Еще раз спасибо. - person Richard Walker; 19.10.2015

Я придумал следующий синтаксис, который удовлетворяет мою потребность в извлечении Json в форме String. Сначала я думал, что неэффективно разбирать, а затем снова переупорядочивать, но потом я понял, что это обеспечивает форму немедленной проверки Json. Но могут быть и более эффективные способы сделать это.

API — это спрей. handleWith использует неявное преобразование в класс случая RawWeatherData.

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